我很想知道[]和Array.new和{}之间的更多差异以及Hash.new
我在它上面运行了同样的基准测试,看起来短线是赢家
require 'benchmark'
many = 500000
Benchmark.bm do |b|
b.report("[] \t") {many.times { [].object_id }}
b.report("Array.new \t") { many.times { Array.new.object_id }}
b.report("{} \t") {many.times { {}.object_id }}
b.report("Hash.new\t") { many.times { Hash.new.object_id }}
end
user system total real
[] 0.080000 0.000000 0.080000 ( 0.079287)
Array.new 0.180000 0.000000 0.180000 ( 0.177105)
{} 0.080000 0.000000 0.080000 ( 0.079467)
Hash.new 0.260000 0.000000 0.260000 ( 0.264796)
我个人喜欢使用简写版的[]和{},代码看起来很酷且可读。
任何其他指针它们之间有什么区别?场景背后会发生什么使它变得更好,以及建议何时使用哪个?
我发现了这个link,但希望获得更多信息。
欢呼声。
答案 0 :(得分:24)
使用Hash.new,您可以为未设置的键设置哈希的默认值。如果您正在进行统计,这非常有用,因为Hash.new(0)
将允许您在不显式初始化密钥的情况下增加密钥。
答案 1 :(得分:6)
所以五十万次他们都“非常快”地跑了。我喜欢任何语言([],{},0,“”等文字的文字,但文字不能做所有事情(参见documentation的其他constructor forms }})。编写干净的代码,并保持一致:这里没有问题:)
然而,我怀疑文字避免常量查找和方法调用,这会导致它们更快,至少在那< em>特定的实现..(比我聪明的人可以查看生成的中间AST来证明/反驳这一点。)
也就是说,如果将Hash
解析为自定义类或Hash.new
的内容被自定义方法替换,该怎么办? {}
无法做到这一点。此外,这些方法必须处理其他参数(或块),而文字则不需要。
答案 2 :(得分:3)
Robert already mentioned Hash.new
您还可以使用Hash.new
的块变体:
x = Hash.new { |hash, key|
hash[key] = key * 2
}
p x #-> {}
p x[1] #-> 2
p x #-> {1=>2}
Array.new
也可用于获取默认值:
p Array.new(5, :a) #-> [:a, :a, :a, :a, :a]