2009-01-23 11 views
9

Das mag ein bisschen eine Frage von Nooby sein, ich habe versucht, in Ruby vor kurzem besser zu werden, und fing an, das fantastische The Ruby Programming Language zu lesen. Etwas, das erwähnt wurde, ist, dass String-Literale als veränderlich betrachtet werden. Daher ist es in einer Schleife besser, eine Variable als ein Literal zu verwenden, da eine neue Zeichenfolge bei jeder Iteration instanziiert wird.Rubin String Veränderlichkeit

Meine Frage ist warum? Zuerst dachte ich, es sei wegen der Interpolation, aber Symbole sind unveränderlich und sie unterstützen die Interpolation. Aus einem statischen Hintergrund ergibt es nicht viel Sinn für mich.

EDIT:

Nach der Lektüre thenduks Antwort, ich glaube, ich kann es haben. AFAIK, Sprachen wie Java oder C# haben keine destruktiven String-Methoden (sie verwenden upcase, aber nicht upcase!). Wegen Sachen wie upcase! oder < <, das Literal kann nicht unveränderlich sein.

Nicht 100% sicher, die andere Möglichkeit ist, dass es ein Kompilierungs-Interning ist, das passiert, was in einer Skriptsprache nicht passiert.

Antwort

7

Nicht wirklich sicher, was genau Ihre Frage, aber betrachten Sie den folgenden Code:

10.times { puts "abc".object_id } 

Dies druckt 10 verschiedene IDs aus. Warum? Nur weil Sie wissen, dass sich diese Zeichenfolge nicht ändert, bedeutet das nicht, dass Ruby dies tut. Wenn Sie denken, dass "abc" sollte nur einmal dann erstellt werden, was passiert, wenn Sie das tun:

10.times { puts "abc".upcase! } 

Die upcase! Methode die Zeichenfolge mutiert oberen Fall zu sein, bei der nächsten Iteration der String in der ersten Iteration erstellt ist nicht die dasselbe mehr.

Vielleicht post ein Code-Beispiel, das für Sie verwirrend ist?

+0

hinzugefügt ein bisschen mehr zu der Frage, und gab eine +1 :) –