我一直在学习 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 如何处理控制流关键字: returnraisebreakredoretry 等。

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

在您的第二个示例中,proc 在 main 的范围内定义。正如 tadman 在下面评论的那样,你不能从 main 返回,只有 exit 可用。

如果您从 proc 切换到 lambda ,您的代码将起作用。

10-07 15:28