先来一段代码:
def f0()
p = Proc.new { return 0 }
p.call
1
end
def f1(p)
p.call
1
end
def f2()
Proc.new { return 0 }
end
puts f0() # 返回0
puts f1(f2()) # 报LocalJumpError: unexpected return
def f3()
yield(11)
end
puts f3(){|x| return x} # 报LocalJumpError: unexpected return
关于这段的疑问是:不清楚f0
不会报错,但是f1(f2())
报错的根本原因。
个人感觉是这样——
f1
在p.call
的时候是回到f2
的上下文去执行的。
f2
的上下文还在,这样f1
执行到p.call
的话就相当于直接在方法外f2().call
yield
也是,相当于直接在f3(){|x| return x}
这个位置的上下文 return,也是在方法外
return
是方法执行后 return value 给调用方,如果在方法外 return 就没有意义
不知道这样理解对不对