iKapex
@iKapex

Как понять конструкцию lambda и ampersand?

есть такой код
decorator = -> (item) do
  # действия с item
end
[array].select(& ->(item) { item[:auth] }).map(&decorator)


я понимаю, что вот эта констукция
[array].select(& ->(item) { item[:auth] }).map(&decorator)

эквивалентна вот этой
[array].select{|item|  item[:auth] }.map(&decoration)

но не могу понять почему.

Конкретно мне непонятен вот этот код
& ->(item) { item[:auth] }
я не понимаю - зачем здесь знак & ? Он уместен только здесь - map(&decoration), потому что в функцию мы передаем lambda

Всем спасибо за ответы
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
@unabl4
ruby on rails web dev
decorator - это объект типа Proc (лямбда, но не суть). Амперсанд, который стоит перед объектом типа Proc, превращает его в block, который НЕ является объектом и вообще не может быть инстанциирован никаким образом. Если амперсанд стоит перед объектом, который НЕ является типом Proc, то он вначале пробует вызвать на нём метод под названием "to_proc", в котором оговорена логика превращения объекта в объект типа Proc, который в свою очередь будет конвертирован в block (пример - Symbol, map(&:to_i))

"#select" и "#map" ожидают именно block на вход
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы