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

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

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

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

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

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

Операторы

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

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

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

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

ruby

lambda

proc

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