在procs,lambdas和blocks中返回语句

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)

mgi*_*nbr 9

正如相关问题中的一个答案所示:

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)