在軌來源:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rbRails源代碼:以奇怪的方式初始化哈希?
以下可以看出
@load_hooks = Hash.new {|h,k| h[k] = [] }
其中在IRB只是初始化一個空的哈希值。有什麼區別做的
@load_hooks = Hash.new
在軌來源:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rbRails源代碼:以奇怪的方式初始化哈希?
以下可以看出
@load_hooks = Hash.new {|h,k| h[k] = [] }
其中在IRB只是初始化一個空的哈希值。有什麼區別做的
@load_hooks = Hash.new
新→new_hash點擊展開源
new(obj)→new_hash
new {| hash,key |塊}→new_hash返回一個新的空的散列。如果隨後通過與哈希條目不對應的鍵訪問此哈希,則返回的值取決於用於創建哈希的新樣式。在第一種形式中,訪問返回nil。如果指定obj,則此單個對象將用於所有默認值。如果指定了一個塊,將使用散列對象和鍵調用它,並返回默認值。如果需要,塊的責任是將值存儲在哈希中。 實施例形成的文檔
# While this creates a new default object each time
h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
h["c"] #=> "Go Fish: c"
h["c"].upcase! #=> "GO FISH: C"
h["d"] #=> "Go Fish: d"
h.keys #=> ["c", "d"]
區別在於處理缺失的值。第一個返回空Array
,第二返回nil
:
irb(main):001:0> a = Hash.new {|h,k| h[k] = [] }
=> {}
irb(main):002:0> b = Hash.new
=> {}
irb(main):003:0> a[123]
=> []
irb(main):004:0> b[123]
=> nil
這裏是鏈接到文件:http://www.ruby-doc.org/core-1.9.3/Hash.html#method-c-new