【问题标题】:Ruby - lambda vs. Proc.new [duplicate]Ruby - lambda 与 Proc.new [重复]
【发布时间】: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

谢谢。

【问题讨论】:

标签: ruby lambda return proc-object


【解决方案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 语句的值,但没有使用,也没有显示出来。

      【讨论】:

      • 你是什么意思“它没有被使用”?你的答案不是很清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      相关资源
      最近更新 更多