Ruby中Proc在不同作用域下返回行为差异的技术咨询
Ruby Proc 的返回行为解析
先看第一个示例代码:
def call_proc puts "Before proc" my_proc = Proc.new { return 2 } my_proc.call puts "After proc" end
- 执行
call_proc时,首先打印Before proc,接着调用my_proc.call。 - Proc 是在
call_proc方法内部定义的,它的返回逻辑绑定的是定义它的方法上下文。所以Proc里的return 2会直接终止call_proc方法,返回值2,后面的puts "After proc"永远不会被执行。
再看第二个示例(先修正代码里的笔误:proc.all应该是proc.call):
def proc_call def inside_call my_proc = Proc.new {return 4} end proc = inside_call proc.call end
- 这里的
inside_call是嵌套在proc_call里的方法,内部定义的Proc,返回上下文绑定的是inside_call方法。 - 当执行
proc = inside_call时,inside_call已经执行完毕并返回了这个Proc对象。之后调用proc.call时,Proc里的return 4试图回到inside_call的执行上下文,但这个方法早就执行结束了,所以会直接抛出LocalJumpError错误,提示无法从Proc闭包中return。
核心规则总结
- Proc 和 Lambda 的返回逻辑有本质区别:Lambda的
return是返回自身,而Proc的return会直接返回到定义它的那个方法/上下文。 - 如果定义Proc的上下文已经不存在(比如对应的方法已经执行完成),此时调用Proc里的
return就会触发错误。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

