为什么调用在方法中声明的返回Proc工作?

时间:2013-02-08 14:42:09

标签: ruby

我一直在玩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

1 个答案:

答案 0 :(得分:3)

这是因为proc对控制流关键字的行为:returnraisebreakredo,{{1}等等。

这些关键字会从定义retry的范围跳出,否则proc会有自己的范围,因此这些关键字会从lambda范围跳转。

在第二个示例中,lambda's在main范围内定义。正如下面proc所述,您无法从tadman返回,只有main可用。

如果您从exit切换到proc,您的代码就会生效。