我知道应该使用Procs和lambdas的不同情况(lambda检查参数数量等),但是它们会占用不同的内存量吗?如果是这样,哪一个更有效?
答案 0 :(得分:7)
Lambdas和Procs之间存在一些差异。
Lambdas拥有所谓的“小额回报”。这意味着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 lambda"
Lambdas会检查传递给它们的参数数量,而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]
答案 1 :(得分:0)
Proc和lambda之间的差异主要与行为有关,并且亚伯拉罕更好地回答并且也被发现here
旧答案谈到Block如何比Ruby Monk:Ascent
所解释和显示的lambda更快答案 2 :(得分:0)
Ruby语言规范没有为procs和lambdas规定任何特定的实现策略,因此任何实现都可以自由选择它想要的任何策略,因为任何实现都可能(或可能不)占用完全不同的内存量。实际上,这不仅适用于lambdas和procs,而且适用于每种类型的对象。 Ruby语言规范仅规定了对象的行为,它不规定任何特定的实现或表示。
但是,由于只有一个类来表示两个 lambdas和procs,因此很可能它们会占用相同数量的内存,无论如何它们得到实施和代表。