2009-01-23 10 views
9

To może być trochę niepotrzebne pytanie, próbowałem ostatnio poprawić jakość ruby ​​i zacząłem czytać fantastyczne The Ruby Programming Language. Wspomnieliśmy, że literały łańcuchowe są uważane za zmienne, więc w pętli lepiej jest użyć zmiennej niż literału, ponieważ nowy ciąg będzie tworzony w każdej iteracji.Zmienność łańcucha ruby ​​

Moje pytanie brzmi: dlaczego? Początkowo myślałem, że to z powodu interpolacji, ale symbole są niezmienne i wspierają interpolację. Pochodzące ze statycznego tła, nie ma dla mnie większego sensu.

EDIT:

Po przeczytaniu thenduks odpowiedź, myślę, że mogę go mieć. AFAIK, języki takie jak Java czy C# nie mają destrukcyjnych metod łańcuchowych (używają upcase, ale nie upcase!). Z powodu rzeczy takich jak upcase! lub < <, literał nie może być niezmienny.

Nie jest to w 100% pewne, druga możliwość jest taka, że ​​chodzi o interakcję podczas kompilacji, co nie ma miejsca w języku skryptowym.

Odpowiedz

7

Nie bardzo wiadomo, co dokładnie Twoje pytanie jest, ale należy rozważyć następujący kod:

10.times { puts "abc".object_id } 

ten wypisuje 10 różnych identyfikatorów. Czemu? Tylko dlatego, że wiesz, że ten ciąg nie zmieni się, nie oznacza, że ​​Ruby ma. Jeśli uważasz, że "abc" powinny być tworzone tylko raz, to co się dzieje, jeśli zrobić:

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

Sposób upcase! mutuje ciąg być wielkimi literami, na następnej iteracji ciąg utworzony w pierwszej iteracji nie jest tak samo już.

Być może zamieścić przykład kodu, który jest mylący?

+0

dodał trochę więcej do pytania i dał +1 :) –