Ändern des Standard-Hashwerts [duplizieren]

8

Mit Ruby können Sie Standardwerte für Hashes definieren:

%Vor%

Die Zuweisung eines Werts wird angezeigt, wenn der Hash angezeigt wird, ein geänderter Standardwert jedoch nicht. Wo ist 'bad' ?

%Vor%

'bad' erscheint, wenn wir explizit nachfragen.

%Vor%

Warum wird der geänderte Standardwert nicht angezeigt, wenn der Hash angezeigt wird?

    
Dragon 29.02.2012, 02:44
quelle

2 Antworten

11

Der Standardwert von Hash funktioniert nicht so, wie Sie es erwarten. Wenn Sie h[k] sagen, läuft der Prozess folgendermaßen ab:

  1. Wenn wir eine k -Schlüssel haben, geben Sie ihren Wert zurück.
  2. Wenn wir einen Standardwert für den Hash haben, geben Sie diesen Standardwert zurück.
  3. Wenn wir einen Block für die Bereitstellung von Standardwerten haben, führen Sie den Block aus und geben Sie seinen Rückgabewert zurück.

Beachten Sie, dass (2) und (3) überhaupt nichts über das Einfügen von k in den Hash sagen. Der Standardwert setzt im Wesentlichen h[k] in folgendes um:

%Vor%

Wenn Sie einfach auf einen nicht vorhandenen Schlüssel zugreifen und den Standardwert zurück erhalten, wird der fehlende Schlüssel nicht zum Hash hinzugefügt.

Außerdem, alles in der Form:

%Vor%

ist fast immer ein Fehler, da Sie für alle Standardwerte genau das gleiche Array oder Hash verwenden. Zum Beispiel, wenn Sie dies tun:

%Vor%

Dann werden h[:i] , h[:j] , ... alle ['a', 'b'] zurückgeben und das ist selten was du willst.

Ich glaube, Sie suchen nach der Blockform des Vorschlagswerts :

%Vor%

Das wird zwei Dinge tun:

  1. Wenn Sie auf einen nicht vorhandenen Schlüssel zugreifen, wird dieser Schlüssel dem Hash hinzugefügt und das angegebene Array wird als Wert verwendet.
  2. Alle Standardwerte sind eindeutige Objekte, so dass die Änderung nicht den Rest verändert.
mu is too short 29.02.2012, 03:13
quelle
2

Was passiert ist, ist, dass Sie den Standardwert des Hashs geändert haben, indem Sie push inging 'unhappy' auf h['bad'] gesetzt haben. Was Sie nicht getan haben wurde tatsächlich dem Hash "schlecht" hinzugefügt, weshalb es bei der Überprüfung von h nicht angezeigt wird.

Nach all dem Code, den du geliefert hast, habe ich Folgendes versucht:

%Vor%

Was mir sicherlich nahelegt, dass der Standardwert geändert wurde. Als Antwort auf Ihre Frage "Warum erscheint der geänderte Standardwert nicht, wenn der Hash angezeigt wird?" Müssten Sie ein Element hinzufügen und nicht nur darauf zugreifen:

%Vor%     
Jon M 29.02.2012 03:10
quelle

Tags und Links