/ / Wie kann ich ein Array in einem Hash in Ruby - Ruby, Arrays, Hash initialisieren?

Wie kann ich ein Array in einem Hash in Ruby initialisieren - Ruby, Arrays, Hash

Ich versuche, einen Hash von Arrays wie zu initialisieren

@my_hash = Hash.new(Array.new)

damit ich kann:

@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"]

Das Problem ist, dass auch jeder neue Hash-Schlüssel zurückgegeben wird ["in the street", "at home"]

@my_hash["bye"]
=> ["in the street", "at home"]
@my_hash["xxx"]
=> ["in the street", "at home"]

!!! ???

Was mache ich falsch, was wäre der richtige Weg, um einen Hash of Arrays zu initialisieren?

Antworten:

85 für die Antwort № 1
@my_hash = Hash.new(Array.new)

Dadurch wird genau ein Array-Objekt erstellt, das jedes Mal zurückgegeben wird, wenn ein Schlüssel nicht gefunden wird. Da Sie immer nur dieses Array mutieren und niemals ein neues erstellen, werden alle Ihre Schlüssel demselben Array zugeordnet.

Was du machen willst ist:

@my_hash = Hash.new {|h,k| h[k] = Array.new }

oder einfach

@my_hash = Hash.new {|h,k| h[k] = [] }

Übergeben eines Blocks an Hash.new unterscheidet sich davon, ein Argument einfach auf zwei Arten zu übergeben:

  1. Der Block wird jedes Mal ausgeführt, wenn ein Schlüssel nicht gefunden wird. Sie erhalten also jedes Mal ein neues Array. In der Version mit einem Argument wird dieses Argument einmal (vorher) ausgewertet new aufgerufen wird) und das Ergebnis davon wird jedes Mal zurückgegeben.

  2. Durch das Tun h[k] = Sie fügen den Schlüssel tatsächlich in den Hash ein. Wenn Sie dies nicht tun, greifen Sie einfach zu @my_hash[some_key] nicht wirklich Ursache some_key in den Hash eingefügt werden.


7 für die Antwort № 2

Versuche dies:

@my_hash = Hash.new { |h, k| h[k] = Array.new }

2 für die Antwort № 3

Das Argument für Hash.new bezieht sich auf den Standardwert für neue Hash-Schlüssel. Wenn Sie also einen Verweis übergeben, wird dieser Verweis für neue Hash-Schlüssel verwendet. Sie aktualisieren diese Referenz, wenn Sie anrufen ...

hash["key"].push "value"

Sie müssen einen neuen Verweis in den Hash-Schlüssel eingeben, bevor Sie Werte dazugeben ...

hash["key1"] = Array.new
hash["key1"].push "value1"
hash["key2"] = Array.new
hash["key2"].push "value2

Sie könnten auch versuchen, dies in eine Hilfsmethode einzukapseln.