Ярлык двоеточия амперсанда Ruby [дубликат]

Возможный дубликат:
Что действительно отображается (&:name), средний в Ruby?

В Ruby я знаю это, если я делаю:

some_objects.each(&:foo)

Это совпадает с

some_objects.each { |obj| obj.foo }

Таким образом, &:foo создает блок { |obj| obj.foo }, превращает его в Proc и передает его каждому. Почему это работает? Это - просто особый случай Ruby или является там причиной, почему это работает, как это делает?

316
задан Community 23 May 2017 в 01:47
поделиться

1 ответ

Ваш вопрос, так сказать, неправильный. То, что здесь происходит, это не "амперсанд и толстая кишка", это "амперсанд и объект". Двоеточие в данном случае для символа. Итак, есть & и есть :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.

.
471
ответ дан 23 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: