[英]How can I initialize an Array inside a Hash in Ruby
我正在嘗試初始化數組的哈希,例如
@my_hash = Hash.new(Array.new)
這樣我可以:
@my_hash["hello"].push("in the street")
=> ["in the street"]
@my_hash["hello"].push("at home")
=> ["in the street", "at home"]
@my_hash["hello"]
=>["in the street", "at home"]
問題在於,任何新的哈希鍵也會返回["in the street", "at home"]
@my_hash["bye"]
=> ["in the street", "at home"]
@my_hash["xxx"]
=> ["in the street", "at home"]
!!! ???
我在做什么錯,初始化數組哈希的正確方法是什么?
@my_hash = Hash.new(Array.new)
這將創建一個數組對象,每次找不到鍵時將返回該數組對象。 由於您只修改該數組而從未創建一個新數組,因此所有鍵都映射到同一數組。
您想要做的是:
@my_hash = Hash.new {|h,k| h[k] = Array.new }
或簡單地
@my_hash = Hash.new {|h,k| h[k] = [] }
將塊傳遞給Hash.new
不同於僅通過兩種方式傳遞參數:
每次找不到鍵時執行該塊。 這樣,您每次都會得到一個新的數組。 在帶有參數的版本中,該參數被評估一次(在調用new
之前),並且每次都返回其結果。
通過執行h[k] =
您實際上將密鑰插入到哈希中。 如果你不這樣做只是訪問@my_hash[some_key]
實際上不會造成some_key
在哈希插入。
嘗試這個:
@my_hash = Hash.new { |h, k| h[k] = Array.new }
Hash.new的參數是新哈希鍵的默認值,因此當您傳遞它的引用時,該引用將用於新哈希鍵。 您在致電時正在更新該參考...
hash["key"].push "value"
您需要在將值推入哈希鍵之前將新引用傳遞給哈希鍵...
hash["key1"] = Array.new
hash["key1"].push "value1"
hash["key2"] = Array.new
hash["key2"].push "value2
您也可以嘗試將其封裝到一個輔助方法中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.