在procs,lambdas和blocks中返回语句

时间:2013-03-22 04:46:32

标签: ruby lambda return block proc

我在理解return在块,触发器和lambdas中的工作方式时遇到了很多麻烦。

例如,在以下情况中,为什么batman_ironman_proc有效,而batman_yield会抛出错误?

def batman_ironman_proc
  victor = Proc.new { return "Batman will win!" }
  victor.call
  "Iron Man will win!"
end

def batman_yield
    yield
    "Iron man will win!"
end

victor = Proc.new { return "Batman will win!" }

puts batman_ironman_proc 
#batman_yield(&victor) === This code throws an error.

2 个答案:

答案 0 :(得分:9)

链接问题中的one answer显示:

  

return关键字始终从当前上下文中的方法或lambda返回。在块中,它将从闭包定义的方法返回。无法从调用方法或lambda。

返回

您的第一个示例是成功的,因为您在要返回的同一函数中定义了victor,因此return在该上下文中是合法的。在第二个示例中,victor在顶层定义。然后,return 的效果是从batman_yield(调用方法)返回,但是[如果它是有效的]从顶层返回本身(定义{{​​1}}的地方)。

澄清:,同时可以访问块的返回值(即“块中计算的最后一个表达式的值作为yield的值传递回方法” - as根据您的评论),由于上述原因,您无法使用Proc关键字。例如:

return

答案 1 :(得分:1)

我来自C背景,我解释它的方式是当你调用一个函数时,你设置一个返回指令号和一个寄存器,它将存储返回的值。在proc和block的情况下,不设置返回指令,因为它们在同一范围内联或调用,但它们仍然可以返回返回值,因为它们是独立的功能。因此,如果没有设置返回指令,proc / block会给我们一个LocalJumpError,而如果我们只想给一个返回的值很好。