【问题标题】:Why does calling a returning Proc, declared within a method, work?为什么调用在方法中声明的返回 Proc 有效?
【发布时间】:2013-01-24 08:40:31
【问题描述】:

我一直在学习 Codecademy Ruby 课程,并且有一个关于 lambda 和 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

【问题讨论】:

标签: ruby


【解决方案1】:

这是因为proc 与控制流关键字的行为方式:returnraisebreakredoretry 等。

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

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

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

【讨论】:

  • 你不能从主服务器return。你只能exit
  • 我从 Oreilly Ruby 书中找到了另一种解释:“return 语句从词法封闭方法返回,即使该语句包含在块中。[...] proc 就像一个块,所以如果你调用一个执行 return 语句的 proc,它会尝试从包含已转换为 proc 的块的方法返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
相关资源
最近更新 更多