Ruby 为什么调用在方法中声明的返回过程会起作用?
我一直在玩我的Ruby课程的codecade,有一个关于lambdas和Procs的练习。我确实理解其中的区别,但我不太明白为什么这里第一个代码清单有效,而第二个代码清单无效 为什么这样做有效:Ruby 为什么调用在方法中声明的返回过程会起作用?,ruby,Ruby,我一直在玩我的Ruby课程的codecade,有一个关于lambdas和Procs的练习。我确实理解其中的区别,但我不太明白为什么这里第一个代码清单有效,而第二个代码清单无效 为什么这样做有效: def batman_ironman_proc p = Proc.new { return "Batman will win!" } p.call "Iron Man will win!" end puts batman_ironman_proc # prints "Batman wil
def batman_ironman_proc
p = Proc.new { return "Batman will win!" }
p.call
"Iron Man will win!"
end
puts batman_ironman_proc # prints "Batman will win!"
但不是这个:
def batman_ironman_proc(p)
p.call
"Iron Man will win!"
end
p = Proc.new { return "Batman will win!" }
puts batman_ironman_proc(p) # unexpected return
这是因为
proc
与控制流关键字的行为:返回
,提升
,中断
,重做
,重试
等等
这些关键字将从定义了proc
的范围跳转,否则lambda
有自己的范围,因此这些关键字将从lambda的
范围跳转
在第二个示例中,proc
是在main的范围内定义的。正如下面的tadman
所评论的,您不能从main
返回,只有exit
可用
如果您从
proc
切换到lambda
,您的代码将正常工作。请查看您无法从main返回。您只能退出
。我从Oreilly Ruby的书中找到了另一种解释:“即使语句包含在一个块中,return
语句也会从词汇封装方法返回。[…]proc类似于块,因此如果调用执行return语句的proc,它将尝试从包含转换为proc的块的方法返回。