Я думаю о них так: лямбда ведет себя больше как функция, а процесс или блок ведут себя больше как структура управления.
Я думаю, что лучший способ понять, почему они существуют и в чем разница, - это понять, как они используются. Возьмите этот код, например:
def find (elem)
@array.each { |item| return item if item == elem }
return false
end
Для любого, кто знаком с Ruby, очевидно, что здесь происходит, но спросите себя, откуда вы возвращаетесь, когда этот return
называется. Что вы ожидаете и что происходит, так это то, что сам метод возвращается. Даже если мы находимся внутри блока кода, это метод , возвращающий, а не только блок. Именно так ведет себя Proc, и именно это позволяет нам использовать цикл .each
и возвращаться из него так же, как и в эквивалентном цикле for
.
С другой стороны, лямбды похожи на функции. Если вы вернетесь из лямбды, она выйдет только из лямбды.
def find (elem)
l = lambda { |item| return item if item == elem }
@array.each(&l)
return false
end
Здесь метод всегда будет возвращать false, поскольку последняя строка не будет пропущена вызовом return
в лямбда-выражении. Лямбды являются функциями и возвращаются из себя, тогда как Procs возвращаются из включающего метода.
Итак, Procs и блоки возвращаются из метода, используя их (как в цикле), а лямбды (как методы) возвращаются из себя.