Ruby - lambda 与 Proc.new [重复]
Posted
技术标签:
【中文标题】Ruby - lambda 与 Proc.new [重复]【英文标题】:Ruby - lambda vs. Proc.new [duplicate] 【发布时间】:2011-10-25 23:17:11 【问题描述】:可能重复: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
?
谢谢。
【问题讨论】:
What's the difference between a proc and a lambda in Ruby? 的副本;另见Differences between Proc and Lambda in Ruby。 @Phrogz。请检查我的问题和您指向的主题中的问题,看看我的问题不是重复 我想这是一个见仁见智的问题。您没有问完全相同的问题,但如果您阅读了该问题的答案,您就会知道您的问题的答案。 另见Control flow differences between Ruby Procs and Lambdas 更详细的答案真的在这里:***.com/questions/626/… 【参考方案1】:这是 Procs 和 lambdas 之间的主要区别之一。
Proc 中的 return 从其封闭的块/方法返回,而 lambda 中的 return 只是从 lambda 返回。当你在 func_two 中调用 lambda 时,它只是简单地返回它的值,而不是保存。
在此处阅读 Procs v. 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
...
【讨论】:
【参考方案2】:在 proc 中,return "123"
冒泡并从外部函数 func_one
返回。因此永远不会遇到第二个 return 语句。
在 lambda 中,return "123"
仅从 lambda 返回。您没有将变量设置为 lambda 的返回值(当您执行 lambda_new.call
时,因此该值基本上只是被抛出。然后,return "456"
被调用并从函数返回。如果,而不是返回"456"
,你返回了lambda_new.call
,func_two
的返回值为"123"
。
【讨论】:
【参考方案3】:123
是lambda_new.call
语句的值,但没有使用,也没有显示出来。
【讨论】:
你是什么意思“它没有被使用”?你的答案不是很清楚。以上是关于Ruby - lambda 与 Proc.new [重复]的主要内容,如果未能解决你的问题,请参考以下文章