2012-08-03 39 views
14

我很想知道[]和Array.new和{}和Hash.new之間的更多差異文字和構造函數的區別? ([] vs Array.new和{} vs 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但是想獲得更多信息。

歡呼聲。

+1

'Hash.new(0)'? – 2012-08-03 19:13:31

回答

22

使用Hash.new,您可以設置未設置鍵的散列的默認值。如果您正在進行統計,這非常有用,因爲Hash.new(0)可讓您遞增密鑰而不顯式初始化它們。

+1

+1指出一個共同的具體情況。 – 2012-08-03 19:30:28

+0

@Robert感謝您指定一個用例,非常酷 – PriteshJ 2012-08-03 19:38:29

4

因此,他們全部跑了50萬次,「非常快」。我更喜歡文字任何語言([],{},0,「」等),但文字不能做所有事情(請參閱documentation其他constructor forms)。寫乾淨的代碼,並且是一致的:這裏沒有問題:)

然而,嫌疑的文字避免恆定的查找和方法調用導致他們速度更快,至少在特別實現。(有人用更多的智慧比我能看一下中間AST產生的證明/反駁這一點。)

也就是說,如果Hash解析爲自定義類Hash.new與被替換什麼自定義方法?不能這樣做,{}。另外,這些方法必須處理額外的參數(或塊),而文字則不需要。

+0

我從來沒有想過這個「Hash.new可以用自定義方法替換,不能用{}來完成」。很好的catch – PriteshJ 2012-08-03 19:25:29

+0

@PriteshJ我希望我永遠不會遇到這樣的代碼:) – 2012-08-03 19:27:36

+0

亞,但它很高興知道這個東西,謝謝 – PriteshJ 2012-08-03 19:29:59

2

Robert already mentionedHash.new

默認值時,也可以使用compley「default'值與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] 
相關問題