Wie füge ich ein Schlüssel / Wert-Paar zum Anfang eines Hashes hinzu?

8

Mein Code ist:

%Vor%

Innerhalb der Methode gibt puts hash { :one => 1, :two => 2, :three => 3 } zurück, aber wenn hash1 an die Methode übergeben wird, bleibt sie danach unverändert. Es ist, als würde sich die Aufgabe nicht außerhalb der Funktion bewegen.

Ich denke, ich könnte den aktualisierten Hash zurückgeben und den Hash, den ich ändern möchte, außerhalb der Methode setzen:

%Vor%

Aber ich verstehe nicht, warum die Aufgabe, die ich dem Hash gebe, nicht außerhalb der Methode bleibt.

Ich habe das, was funktioniert:

%Vor%

Das gibt mir, was ich will, wenn diese Methode aufgerufen wird, aber es scheint nur ein wenig übertrieben zu sein, den Hash so zu rekonstruieren.

    
qrrr 18.09.2013, 21:11
quelle

5 Antworten

7

Ruby übergibt Objekte an Methoden nach Wert, aber der Wert ist der Verweis auf das Objekt. Wenn Sie also hash=temp_hash in der Methode add_hash festlegen, gilt diese Änderung nur innerhalb der Methode. Der Wert von Hash außerhalb der Methode ist unverändert.

%Vor%

Wenn Sie möchten, dass der Hash aktualisiert wird, müssen Sie den Hash-Inhalt ersetzen, anstatt den Hash-Wert an einem neuen Objekt neu zu setzen, wie Sie es beim Löschen getan haben, und fügen Sie die Werte erneut hinzu. Sie können dies auch mit der Methode replace tun.

%Vor%

Es gibt einige gute Diagramme zum Wertübergeben in " Is Ruby nach Referenz oder nach Wert? "

    
GregA100k 18.09.2013, 21:48
quelle
11

Wie wäre es damit?

%Vor%

Beispiel # 2:

%Vor%     
Bala 18.09.2013 21:21
quelle
1

HINWEIS: Diese Antwort ist aus den Zeiten alt, als Ruby 1.8 noch vorhanden war.

Im Allgemeinen bietet die Klasse Hash in Ruby keine Sortierung. Das Verhalten kann sich bei Ruby-Versionen / Implementierungen unterscheiden.

Siehe auch: Hash-Reihenfolge zwischen Iterationen beibehalten, wenn nicht geändert?

Wenn Sie eine Bestellung aufgeben möchten, müssen Sie die Klasse OrderedHash verwenden, die über ActiveSupport bereitgestellt wird

Siehe: Ссылка

    
Tilo 18.09.2013 21:21
quelle
0

Am Ende der Funktion haben Sie nur puts den Hash, nicht zurückgeben. Vielleicht, wenn Sie puts hash in return hash geändert haben, würde es funktionieren (ich habe es selbst nicht versucht).

    
Edmund 18.09.2013 21:28
quelle
0

temp_hash ist eine lokale Variable, die gelöscht wird, sobald die Funktion zurückkehrt.

    
Bharat Jain 18.09.2013 21:30
quelle

Tags und Links