2014-04-28 14 views

Odpowiedz

23

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.

+1

To jest świetna dogłębna odpowiedź. – alex

+1

Dziękuję. Myślę, że jest to ważny obszar, o którym należy pamiętać podczas pisania programów Ruby. – Sigi

4

\ na końcu linii przerwie interpretator traktując znak nowej linii jako koniec instrukcji. W związku z tym można utworzyć łańcuch wielowierszowy bez konieczności ponoszenia kosztów konkatenacji lub dołączania.

Powiązane problemy