4

我知道在不同的情况下应该使用 Procs 和 lambdas(lambda 检查参数的数量等),但是它们占用的内存量是否不同?如果是这样,哪个更有效?

4

3 回答 3

8

Lambdas 和 Procs 之间有几个不同之处。

  1. Lambda 具有所谓的“小回报”。这意味着 Lambda 会将流返回到调用它的函数,而 Proc 将从调用它的函数返回。

     def proc_demo
       Proc.new { return "return value from Proc" }.call
       "return value from method"
     end
    
     def lambda_demo
       lambda { return "return value from lambda" }.call
       "return value from method"
     end
    
     proc_demo    #=> "return value from Proc"
     lambda_demo  #=> "return value from method"
    
  2. Lambda 会检查传递给它们的参数数量,而 Procs 则不会。例如:

     lambda { |a, b| [a, b] }.call(:foo)
     #=> #<ArgumentError: wrong number of arguments (1 for 2)>
    
     Proc.new { |a, b| [a, b] }.call(:foo)
     #=> [:foo, nil]
    
于 2013-08-14T01:05:38.717 回答
0

Ruby 语言规范没有为 procs 和 lambdas 规定任何特定的实现策略,因此任何实现都可以自由选择它想要的任何策略,因此任何实现可能(或可能不会)占用完全不同的内存量。实际上,这不仅适用于 lambdas 和 procs,而且适用于一种对象。Ruby 语言规范规定了对象的行为,它没有规定任何特定的实现或表示。

但是,由于只有一个类可以同时表示lambda 和 proc,因此它们很可能占用完全相同的内存量,而不管它们是如何实现和表示的。

于 2013-08-14T10:07:53.963 回答
0

Proc 和 lambda 之间的差异主要与行为相关,Abraham 回答得更好,也可以在此处找到

旧答案谈到了 Block 如何比 lambda 更快,如Ruby Monk:Ascent中所解释和所示

于 2013-08-14T01:04:19.163 回答