文字和构造函数之间的差异? ([] vs Array.new和{} vs Hash.new)

时间:2012-08-03 19:11:30

标签: ruby-on-rails ruby

我很想知道[]和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,但希望获得更多信息。

欢呼声。

3 个答案:

答案 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]