我在理解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.
答案 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,而如果我们只想给一个返回的值很好。