Для уточнения:
Джо говорит, что поведение возврата Proc.new
удивительно. Однако, если учесть, что Proc.new ведет себя как блок, это неудивительно, поскольку именно так ведут себя блоки. ламбы, с другой стороны, ведут себя больше как методы.
Это фактически объясняет, почему Procs гибки, когда дело доходит до arity (количество аргументов), а лямбды - нет. Блоки не требуют предоставления всех своих аргументов, а методы - (если не указано значение по умолчанию). Хотя предоставление аргумента лямбда по умолчанию не является опцией в Ruby 1.8, теперь он поддерживается в Ruby 1.9 с альтернативным синтаксисом лямбды (как отмечено в webmat):
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
И Мишель де Маре (ОП) не прав насчет проков и лямбда, которые ведут себя одинаково с arity в Ruby 1.9. Я подтвердил, что они все еще поддерживают поведение от 1.8, как указано выше.
break
утверждения не имеют большого смысла ни в Procs, ни в лямбдах. В Procs перерыв вернет вас из Proc.new, который уже был завершен. И нет смысла выходить из лямбды, поскольку это по сути метод, и вы никогда не выйдете из верхнего уровня метода.
next
, redo
и raise
ведут себя одинаково как в процедурах, так и в лямбдах. Принимая во внимание, что retry
не разрешен ни в одном и вызовет исключение.
И, наконец, метод proc
никогда не следует использовать, поскольку он несовместим и имеет неожиданное поведение. В Ruby 1.8 он действительно возвращает лямбду! В Ruby 1.9 это было исправлено и возвращает Proc. Если вы хотите создать Proc, используйте Proc.new
.
Для получения дополнительной информации я настоятельно рекомендую язык программирования Ruby от O'Reilly, который является источником большинства этой информации.