Warum das Fehlen des Zuweisungsoperators mich erlauben, ein Ruby-Konstante ohne Compiler-Warnung zu ändern?

StackOverflow https://stackoverflow.com/questions/670094

Frage

In den folgenden beiden Beispielen kann ich die gleiche Sache, eine konstante String Erstellung und Verwendung der concat Methode, um es zu ändern. Weil es eine Konstante ist, erwarte ich eine Compiler-Warnung aber nur einen im zweiten Beispiel erhalten, wenn ich den Zuweisungsoperator verwenden. Warum ist das?

X = "hello"
X.concat(" world")
puts X # no warning

X = "hello"
X = X.concat(" world")
puts X # warning: already initialized

Da die concat Methode die Zeichenfolge an Ort und Stelle ändert, das ist normal, was würde ich tun, da gibt es keine Notwendigkeit einen assigment Operator zu verwenden. Also, warum ist das Vorhandensein des Zuweisungsoperators bewirken, dass der Compiler diese beiden Vorgänge als unterschiedlich identifizieren?

War es hilfreich?

Lösung

Das ist, weil Sie eine neue X neu zu definieren Wenn Sie eine Konstante neu definieren Sie die „bereits initialisiert“ Fehler gibt. Das erste Beispiel diesen Fehler nicht geben, weil Sie nicht X neu zu definieren, können Sie es sind zu ändern.

Andere Tipps

In Ruby Variablen sind Zeiger im Wesentlichen auf einen Platz in einem Speicher ein Objekt enthält - nicht das Objekt selbst. Im zweiten Beispiel werden Initialisieren Sie eine Konstante X auf ein Objekt in der ersten Zeile (X = "hello") Punkt, und in der zweiten Zeile, initialisieren Sie wieder die Konstante - aber es weist bereits auf ein Objekt, so dass Sie das bekommen Fehler.

Unveränderlichkeit eine Konstante ist, bedeutet nicht, dass Sie das Objekt nicht ändern können - es bedeutet nur, können Sie die Konstante ändern, um zu zeigen andere Objekt

.

Wenn Sie Ihre Zeichenfolge „echte“ konstant machen, versuchen ‚einzufrieren‘:

X = "foo".freeze        # => "foo" 
X.concat("bar")

TypeError: can't modify frozen string
    from (irb):2:in `concat'
    from (irb):2

Ich ermutige Sie wirklich der Ruby-Programmierung Languge zu lesen.

Das ist, weil die Konstante X ist eine Referenz auf ein String Objekt zu speichern. In Ihrem ersten Beispiel modifizieren Sie den internen Zustand des String Objekts, aber nicht die Referenz durch die Konstante gespeichert. Im zweiten Beispiel, ändern Sie die durch die Konstante zu einem neuen String Objekt gespeicherten Referenz, die aus dem concat Verfahren zurückgeführt wird.

Das Spitzhacke Buch erklärt diese hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top