文字和构造函数之间的差异? ( vs Array.new和{} vs Hash.new)
我很想知道[]和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)
我个人喜欢使用简写的[]和{},代码看起来很酷且可读。
任何其他指针它们之间有什么区别? 场景背后会发生什么使它变得更好,并建议何时使用哪个?
我找到了这个链接,但希望获得更多信息。
干杯。
使用Hash.new,您可以为未设置的键设置哈希的默认值。 如果您正在进行统计,这非常有用,因为Hash.new(0)
将允许您在不显式初始化密钥的情况下增加密钥。
所以五十万次他们都“非常快”地跑了。 我更喜欢任何语言的文字([],{},0,“”等),但文字不能做任何事情(参见其他构造函数forms的文档 )。 编写干净的代码,并保持一致:这里没有问题:)
但是, 我怀疑文字避免了常量查找和方法调用 ,这导致它们更快,至少在那个特定的实现中。(比我聪明的人可以查看生成的中间AST来certificate/反驳这一点。)
也就是说,如果Hash
解析为自定义类或者Hash.new
被自定义方法替换了怎么办? {}
无法做到这一点。 此外,这些方法必须处理其他参数(或块),而文字则不需要。
罗伯特已经提到了Hash.new
的默认值
您也可以使用Hash.new
的块变体的compley’default’值:
x = Hash.new { |hash, key| hash[key] = key * 2 } px #-> {} px[1] #-> 2 px #-> {1=>2}
Array.new
也可用于获取默认值:
p Array.new(5, :a) #-> [:a, :a, :a, :a, :a]