Какова функциональность оператора "&:" в рубине?

Возможный дубликат:
Что означает map (&: name) в Ruby?

Я наткнулся на фрагмент кода, который имел следующий

a.each_slice(2).map(&:reverse)

Я не знаю функциональности оператора &:. Как это работает?

Ответ 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)

Ответ 2

Добавив & к символу, вы создаете функцию лямбда, которая выведет метод с именем этого символа на объект, который вы передаете этой функции. Принимая это во внимание:

ar.map(&:reverse)

примерно эквивалентен:

ar.map { |element| element.reverse }