Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么调用在方法中声明的返回过程会起作用?_Ruby - Fatal编程技术网

Ruby 为什么调用在方法中声明的返回过程会起作用?

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

我一直在玩我的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 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的块的方法返回。