W języku Ruby ciągi literałów są przydzielane jako obiekty w pamięci po ich napotkaniu. Jeśli złączyć dwa literały ciągów znaków, jak w
str = "foo" + "bar"
będzie faktycznie przeznaczyć trzy String
obiekty: "foo"
, "bar"
i wynik konkatenacji (który jest następnie określoną przez str
).
To samo dzieje się, jeśli nie:
"foo" << "bar"
W wielu przypadkach jest to tylko łagodna niewydolność który nie należy martwić się zbytnio.
Należy jednak pamiętać, że jeśli to zrobić w pętli, a jeżeli łączna String
rośnie duża, można przeznaczyć coraz większą String
obiektu przy każdej iteracji (można tego uniknąć poprzez zbieranie części ciągów w Array
, a następnie wywołanie join
po zakończeniu, a także, foo << 'bar'
będzie modyfikować foo
w miejscu, co jest dopuszczalne w pętli).
Korzystając \
nie złączyć obiektów pośrednich, lecz skutecznie zaprezentować parser z jednym String
dosłowny (bo \
prostu kontynuuje ciąg na następnej linii).
Idiom jest często używany w Javie, gdzie łańcuchy są niezmienne, a literały są łączone w czasie kompilacji. (Każdy tekst literowy w Javie jest zapisywany tylko raz, a następnie ponownie wykorzystywany w całym kodzie, Ruby tego nie robi.) Ponadto Java nie ma lepszego sposobu na kontynuowanie ciągów w wielu liniach, dlatego programiści Java robią to w ten sposób.
To jest świetna dogłębna odpowiedź. – alex
Dziękuję. Myślę, że jest to ważny obszar, o którym należy pamiętać podczas pisania programów Ruby. – Sigi