我一直在阅读 Flanagan-Matz 的 Ruby Programming Language 一书
上下文:Proc.new 和 lambda wrt return 语句之间的区别
该书指出,lambda 中的返回不应引发LocalJumpError(因为 lambda 类似于方法调用)。lambda 中的 return 只是退出 lambda - 而不是包含迭代器的方法。
但是,以下代码片段另有说明。这里有什么问题?
def caller( aProc, switch)
puts "Start Caller"
case switch
when :normal_block; iterator &aProc
when :block_parameter; iterator_blockparam(&aProc)
else iterator_param(aProc)
end
puts "End Caller"
end
def iterator
puts "Begin iterator"
[1,2,3,4].each { |x| yield x }
puts "End iterator"
end
def iterator_blockparam(&block)
puts "Start Iterator wBlockParam"
puts "Block is {block.lambda? ? 'Lambda' : 'Proc'}"
[1,2,3,4].each { |x| block[x] }
puts "End Iterator wBlockParam"
end
def iterator_param(aProc)
puts "Start Iterator wParam"
puts "Block is {aProc.lambda? ? 'Lambda' : 'Proc'}"
[1,2,3,4].each{ |x| aProc[x]}
puts "End Iterator wParam"
end
# enclosing method Proc.new already returned.
no3proc = Proc.new{|x| return -101 if x == 3; puts x }
no3lambda = lambda{|x| return -101 if x == 3; puts x }
#~ caller( no3proc, :normal_block) #=> LocalJumpError
caller( no3lambda, :normal_block ) # => LJE
#~ caller( no3proc, :block_parameter) #=> LJE
#~ caller( no3lambda, :block_parameter) # works!
#~ caller(no3proc, :with_param) #=> LJE
#~ caller(no3lambda, :with_param) # works!