& trước một object sẽ gọi to_proc trên nó rồi truyền kết quả như một block.
Symbol implement to_proc để tạo block gọi method cùng tên trên mỗi phần tử.
# Dài dòng:
[1, 2, 3].map { |n| n.to_s } # => ["1", "2", "3"]
# Ngắn hơn với Symbol#to_proc:
[1, 2, 3].map(&:to_s) # => ["1", "2", "3"]
# &method(:name) — khi method nhận argument (không phải receiver)
words = ["hello", "WORLD"]
words.select(&method(:puts)) # puts mỗi phần tử
def odd?(n) = n.odd?
[1, 2, 3, 4].select(&method(:odd?)) # => [1, 3]Khi dùng &method(:name): khi muốn pass một method (không phải method của element) vào iterator — ví dụ method(:puts), method(:validate), hoặc bất kỳ method cần nhận element làm argument đầu tiên.
& before an object calls to_proc on it, then passes the result as a block.
Symbol implements to_proc to create a block that calls the named method on each element.
# Verbose:
[1, 2, 3].map { |n| n.to_s } # => ["1", "2", "3"]
# Compact with Symbol#to_proc:
[1, 2, 3].map(&:to_s) # => ["1", "2", "3"]
# &method(:name) — when the method takes the element as an argument
def odd?(n) = n.odd?
[1, 2, 3, 4].select(&method(:odd?)) # => [1, 3]Use &method(:name) when: you want to pass a method (not a method on the element) into an iterator — e.g. method(:puts), method(:validate), or any method that takes the element as its first argument.