我一直在学习 Codecademy Ruby 类(class),并且有一个关于 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
最佳答案
这是因为 proc
如何处理控制流关键字: return
、 raise
、 break
、 redo
、 retry
等。
这些关键字将从定义 proc
的范围跳转,否则 lambda
有自己的范围,因此这些关键字将从 lambda's
范围跳转。
在您的第二个示例中,proc
在 main 的范围内定义。正如 tadman
在下面评论的那样,你不能从 main
返回,只有 exit
可用。
如果您从 proc
切换到 lambda
,您的代码将起作用。