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.callfunc_two的返回值为"123"

【讨论】:

【参考方案3】:

123lambda_new.call 语句的值,但没有使用,也没有显示出来。

【讨论】:

你是什么意思“它没有被使用”?你的答案不是很清楚。

以上是关于Ruby - lambda 与 Proc.new [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:如何获取可选 proc 参数的默认值

为啥我不能在 Ruby 中将块传递给 proc?

传递给`instance_exec`时如何执行proc

为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?

Ruby:将proc转换为lambda?

ruby Ruby Proc,Lambda和Closure