Ruby - lambda vs. Proc.new

时间:2011-08-12 16:19:26

标签: ruby lambda return proc-object

  

可能重复:
  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

感谢。

3 个答案:

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

答案 2 :(得分:0)

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