Когда использовать лямбду, когда использовать Proc.new?

Чтобы дать дополнительные ruby пояснения:

Джои говорит, что lambda-functions поведение Proc.new при возврате вызывает lambda удивление. Однако, если учесть, что lambda-functions Proc.new ведет себя как блок, это ruby неудивительно, поскольку lambdaexpression именно так ведут себя блоки. с lambda-expressions другой стороны, ламбы больше proc похожи на методы.

Это фактически lambda объясняет, почему Procs гибки, когда lambda дело касается арности (количества lambda аргументов), а лямбды - нет. Блоки ruby не требуют предоставления ruby всех своих аргументов, но proc методы требуют (если не указано lambda-expressions значение по умолчанию). Хотя lambda-functions предоставление лямбда-аргумента generic-lambda по умолчанию не является lambda-expressions опцией в Ruby 1.8, теперь proc оно поддерживается в Ruby lambda-expressions 1.9 с альтернативным синтаксисом lambda лямбда-выражения (как отмечает lambda-expressions webmat):

concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1)   # => "12"

И Мишель де Маре lambdaexpression (OP) неверно говорит о том, что lambda-expressions Procs и лямбда ведут себя lambda-expressions одинаково с arity в Ruby generic-lambda 1.9. Я убедился, что они ruby по-прежнему поддерживают lambda-expressions поведение начиная с версии lambda-expressions 1.8, как указано выше.

Операторы

break на lambda-functions самом деле не имеют особого generic-lambda смысла ни в Procs, ни в лямбдах. В lambda Procs перерыв вернет вас lambda из Proc.new, который уже lambda был завершен. И нет никакого generic-lambda смысла отказываться от лямбды, поскольку lambda-expressions это, по сути, метод, и вы lambda никогда не откажетесь от lambda-expressions верхнего уровня метода.

next, redo и lambda raise ведут себя одинаково как lambda-expressions в Procs, так и в лямбдах. В generic-lambda то время как retry не допускается lambda ни в том, ни в другом случае lambda-functions и вызовет исключение.

И, наконец, никогда ruby не следует использовать метод proc proc, поскольку он непоследователен generic-lambda и имеет неожиданное поведение. В proc Ruby 1.8 он фактически возвращает lambdaexpression лямбду! В Ruby 1.9 это было lambda-expressions исправлено, и он возвращает lambda Proc. Если вы хотите создать lambdaexpression Proc, придерживайтесь Proc.new.

Для proc получения дополнительной lambda-expressions информации я настоятельно generic-lambda рекомендую O'Reilly Язык программирования Ruby, который lambda является моим источником lambda-functions большей части этой информации.

ruby

lambda

proc

2022-08-22T14:10:07+00:00