Еще одно обсуждение proc и lambda

Я думал, что когда вы вызываете proc внутри метода, возвращаемое значение proc вызовет возврат из контекста блока out, вызвавшего proc. Когда я вызываю test(a_block), я чувствую, что puts "after the block" не должен выполняться, так как из процедуры было возвращено значение. Далее... test(a_block) и test(b_block) ведут себя точно так же. Я думал, что здесь должна быть разница?

a_block = Proc.new do
  puts "in the Proc"
  55
end

b_block = lambda do 
  puts "in the lambda"
  66
end

def test(block)

  puts "in test"
  puts block.call
  puts "after the block"
  99 
end

puts test(a_block)
puts test(b_block)

person slindsey3000    schedule 04.12.2011    source источник
comment
Поместите «возврат» в каждый блок, и вы увидите разницу.   -  person megas    schedule 04.12.2011
comment
возможный дубликат В чем разница между proc и лямбда в Ruby?   -  person Andrew Grimm    schedule 05.12.2011


Ответы (2)


возвращаемое значение

в вашем первом предложении следует читать как

заявление о возврате

Используйте return 66 и return 55 и вы увидите свет!

Отличное исследование замыканий в Ruby можно найти здесь: http://innig.net/software/ruby/closures-in-ruby.rb

person Oleg Mikheev    schedule 04.12.2011

Согласно этому вопросу, они должен вести себя точно так же в вашем примере. Единственное заметное отличие состоит в том, что lambda проверяет количество аргументов при вызове, тогда как Proc.new выдает ошибку неопределенного метода.

Обратите внимание, что я не эксперт Ruby-ist. Я прочитал ваш вопрос, а затем щелкнул первую «связанную» ссылку на боковой панели, которая выглядела полезной. Пожалуйста, ищите более тщательно в будущем.

person semisight    schedule 04.12.2011