2010-04-22 102 views
2

今天我試了下面的代碼片段,我不明白爲什麼我會在它們之間得到不同的結果。據我所知他們是一樣的。未使用哈希默認值

其中一個使用默認值off Hash,另一個片段在密鑰被訪問之前爲該密鑰創建一個空數組。

任何瞭解正在發生的事情的人? :)

# Hash default if the key doesn't have a value set is an empty Array 
a = Hash.new([]) 
a[:key] << 2 # => [2] 
p a # => {} nil 
p a[:key] # => [2] 
p a.keys # => [] 
p a.values # => [] 

# Explicitly add an array for all nodes before creating 
b = Hash.new 
b[:key] ||= [] 
b[:key] << 2 # => [2] 
p b # => {:key=>[2]} 
p b.keys # => [:key] 

的Ruby版本1.8.7

+2

我有同樣的問題,前一段時間: http://stackoverflow.com/questions/2552579/ruby-method-array-not-updating-the-array -in-hash – 2010-04-22 15:28:23

+0

我不認爲它們是相同的。如果我嘗試使用塊,就像你一樣,我看不到使用'p a [:key]'輸入的值。但是,默認不是塊,我確實得到了值,但除非我調用特定的鍵,否則它不會顯示。用'a.keys'或'a.value',我得到一個空的'Array'。 似乎是一種將密鑰添加到「哈希」中的方式,無論出於何種原因,這都是好的。 – gaqzi 2010-04-22 15:59:49

+0

對不起,不完全一樣。你已經改變了默認值(嘗試在第一個例子中打印'a [:foo]',你會看到)。我總是從一個空陣列開始。順便說一句,我也問過這一個,似乎更加類似:http://stackoverflow.com/questions/1822021/why-does-hash-new-hide-hash-members – 2010-04-22 16:15:45

回答

4

當你做a[:key] << 2,你說溜空數組默認值並加入2到它(修改實際的數組,而不是引用)而不讓哈希對象a知道你改變了任何東西。你修改了a使用作爲默認的對象,所以你會看到這個問題,以及:

p a[:wat] #=> [2] 
p a[:anything] #=> [2] 

在第二個例子,你犯了一個新的數組,並使用b[:key]=告訴b,它有下一個值那把鑰匙。

c = Hash.new([]) 
c[:key] += [2] 

這將訪問c[:key]並作出新的陣列+並重新分配它:

,如果你想兩全其美的嘗試。

5

也許這將幫助:

a = Hash.new { |hash, key| hash[key] = [] } 
a[:key] << 2 # => [2] 
a[:key]  # => [2] 
p a   # => {:key=>[2]}