可能重复:
What's the difference between a proc and a lambda in Ruby?
运行此Ruby
代码时:
def func_one
proc_new = Proc.new {return "123"}
proc_new.call
return "456"
end
def func_two
lambda_new = lambda {return "123"}
lambda_new.call
return "456"
end
puts "The result of running func_one is " + func_one
puts ""
puts "The result of running func_two is " + func_two
我得到的结果如下:
The result of running func_one is 123
The result of running func_two is 456
对于func_two
,第一个 return
的值是哪里,即123
?
感谢。
答案 0 :(得分:28)
这是Procs和lambdas之间的主要区别之一。
Proc中的返回从其封闭的块/方法返回,而lambda中的返回只是从lambda返回。当你在func_two中调用lambda时,它只是返回它的值,而不是保存它。
请阅读Procs诉lambdas: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls
请参阅重复的SO问题: Why does explicit return make a difference in a Proc?
编辑:
为了进一步说明这种差异,请将func_one和func_two换成块,看看会发生什么:
> begin; lambda { return 1 }.call end
1
> begin; Proc.new { return 1 }.call end
LocalJumpError: unexpected return
...
答案 1 :(得分:4)
在proc中,return "123"
冒出来并从外部函数func_one
返回。因此,永远不会遇到第二个return语句。
在lambda中,return "123"
仅从lambda返回。你没有将变量设置为lambda的返回值(当你执行lambda_new.call
时,所以该值基本上被抛出。然后,return "456"
被调用并从函数返回。 ,而不是返回"456"
,您返回lambda_new.call
,func_two
的返回值为"123"
。
答案 2 :(得分:0)
123
是lambda_new.call
语句的值,但未使用且未显示。