簡體   English   中英

如何在Ruby中的哈希中初始化數組

[英]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不同於僅通過兩種方式傳遞參數:

  1. 每次找不到鍵時執行該塊。 這樣,您每次都會得到一個新的數組。 在帶有參數的版本中,該參數被評估一次(在調用new之前),並且每次都返回其結果。

  2. 通過執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM