Ответ 1
В Ruby нет оператора &:
. То, что вы видите, это оператор &
, примененный к :symbol
.
В списке аргументов метода оператор &
принимает свой операнд, преобразует его в объект Proc
, если он еще не (путем вызова to_proc
на нем) и передает его методу, как если бы блок был использован.
my_proc = Proc.new { puts "foo" }
my_method_call(&my_proc) # is identical to:
my_method_call { puts "foo" }
Итак, теперь вопрос становится "Что делает Symbol#to_proc
?", и это легко увидеть в документации Rails:
Превращает символ в простой proc, что особенно полезно для перечислений. Примеры:
# The same as people.collect { |p| p.name }
people.collect(&:name)
# The same as people.select { |p| p.manager? }.collect { |p| p.salary }
people.select(&:manager?).collect(&:salary)