45

可能重复:
Ruby 中的 proc 和 lambda 有什么区别?

运行此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的值在哪里,也就是? return123

谢谢。

4

3 回答 3

38

这是 Procs 和 lambdas 之间的主要区别之一。

Proc 中的 return 从其封闭的块/方法返回,而 lambda 中的 return 只是从 lambda 返回。当您在 func_two 中调用 lambda 时,它只是简单地返回其值,而不是保存。

在此处阅读 Procs v. lambdas: http ://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

请参阅重复的 SO 问题: 为什么显式返回会对 Proc 产生影响?

编辑:

为了进一步说明这种差异,将 func_one 和 func_two 交换为块,看看会发生什么:

> begin; lambda { return 1 }.call end
1
> begin; Proc.new { return 1 }.call end
LocalJumpError: unexpected return
...
于 2011-08-12T16:25:36.083 回答
4

在 proc 中,return "123"冒泡并从外部函数返回,func_one. 因此,永远不会遇到第二个 return 语句。

在 lambda 中,return "123"仅从 lambda 返回。您没有将变量设置为 lambda 的返回值(当您这样做时lambda_new.call,该值基本上只是被抛出。然后,return "456"调用并从函数返回。如果您没有返回,而是"456"返回lambda_new.call,则返回func_two的值为"123"

于 2011-08-12T16:25:53.323 回答
0

123lambda_new.call语句的值,但未使用且未显示。

于 2011-08-12T16:26:04.463 回答