我一直在玩Codecademy Ruby课程,并且有一个关于lambdas和Procs的练习。我确实理解了这种差异,但我不太明白为什么第一个代码列表在这里工作,而第二个代码没有。
为什么这样做:
def batman_ironman_proc
p = Proc.new { return "Batman will win!" }
p.call
"Iron Man will win!"
end
puts batman_ironman_proc # prints "Batman will win!"
但不是这样:
def batman_ironman_proc(p)
p.call
"Iron Man will win!"
end
p = Proc.new { return "Batman will win!" }
puts batman_ironman_proc(p) # unexpected return
答案 0 :(得分:3)
这是因为proc
对控制流关键字的行为:return
,raise
,break
,redo
,{{1}等等。
这些关键字会从定义retry
的范围跳出,否则proc
会有自己的范围,因此这些关键字会从lambda
范围跳转。
在第二个示例中,lambda's
在main范围内定义。正如下面proc
所述,您无法从tadman
返回,只有main
可用。
如果您从exit
切换到proc
,您的代码就会生效。