Ruby中Proc对象内部return语句的返回层级及代码执行异常原因咨询
Ruby中Proc对象的return语句行为解析
1. Proc内部的return会返回至哪个层级?
这其实是Ruby里Proc的核心特性之一:Proc是绑定了定义它的上下文的闭包,它内部的return语句会直接返回到定义这个Proc的方法层级,而不是调用它的那个方法。简单说就是,Proc在哪里“出生”的,return就会从那个“出生地”方法直接跳出来。
2. 为什么示例代码里永远到不了a2?
先把你给的代码再贴出来方便分析:
def a puts "a1" l = Proc.new {puts "proc"; return} b l puts "a2" end def b x puts "b1" x.call puts "b2" end a
咱们一步步走一遍执行流程,你就明白为啥a2没机会执行了:
- 首先调用
a方法,第一行就输出a1 - 接着定义了Proc
l,这个Proc是在a方法内部定义的,所以它的return是和a方法绑定死的 - 然后调用
b方法并把l传进去,b方法先执行puts "b1",输出b1 - 接下来执行
x.call,也就是调用Procl:先输出proc,然后执行return——注意!这个return不是终止b方法,而是直接触发它绑定的上下文,也就是直接跳出整个a方法 - 这样一来,
a方法里b l之后的puts "a2"直接被跳过,连b方法里x.call之后的puts "b2"也没机会执行了
如果想让return只在Proc内部或者调用它的方法里生效,你可以换成Lambda来定义。Lambda的return只会从Lambda自身返回,不会跳出定义它的外层方法。比如把Proc.new换成lambda,执行顺序就会变成你预期的a1 > b1 > proc > b2 > a2啦。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

