vol*_*air 11 ruby lambda return block proc
我在理解return块,触发器和lambda中的工作方式时遇到了很多麻烦.
例如,在下面的例子中,为什么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.
Run Code Online (Sandbox Code Playgroud)
正如相关问题中的一个答案所示:
的
return关键字总是从在当前上下文中的方法或λ返回.在块中,它将从定义闭包的方法返回.无法从调用方法或lambda 返回.
您的第一个示例是成功的,因为您victor在要返回的同一函数中定义,因此return在该上下文中是合法的.在您的第二个示例中,victor已在顶级定义.return那么,它的效果不是从batman_yield(调用方法)返回,而是[如果它是有效的]从顶层本身返回(Proc定义的位置).
澄清:虽然您可以访问块的返回值(即"在块中计算的最后一个表达式的值作为yield的值传递回方法" - 根据您的注释),您不能使用的return关键词,对于其原因如上所述.例:
def batman_yield
value = yield
return value
"Iron man will win!"
end
victor = Proc.new { return "Batman will win!" }
victor2 = Proc.new { "Batman will win!" }
#batman_yield(&victor) === This code throws an error.
puts batman_yield(&victor2) # This code works fine.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9972 次 |
| 最近记录: |