Возможный дубликат:
Что действительно отображается (&:name), средний в Ruby?В Ruby я знаю это, если я делаю:
some_objects.each(&:foo)
Это совпадает с
some_objects.each { |obj| obj.foo }
Таким образом,
&:foo
создает блок{ |obj| obj.foo }
, превращает его в Proc и передает его каждому. Почему это работает? Это - просто особый случай Ruby или является там причиной, почему это работает, как это делает?
Ваш вопрос, так сказать, неправильный. То, что здесь происходит, это не "амперсанд и толстая кишка", это "амперсанд и объект". Двоеточие в данном случае для символа. Итак, есть &
и есть :foo
.
&
вызывает to_proc
на объекте, и передает его как блок методу. В Rails to_proc
реализована на Symbol
, так что эти два вызова эквивалентны:
something {|i| i.foo }
something(&:foo)
Также, to_proc
на Symbol
реализована на Ruby 1.8.7 и 1.9, так что на самом деле это "рубиновая штука".
Итак, подведем итог: &
вызывает to_proc
на объект и передает его как блок методу, а Ruby реализует to_proc
на Symbol
.