Dołączanie do istniejącego ciągu


104

To właśnie robię, aby dołączyć do istniejącego ciągu.

s = 'hello'
s.gsub!(/$/, ' world');

Czy istnieje lepszy sposób na dołączenie do istniejącego ciągu.

Zanim ktoś zasugeruje następującą odpowiedź, pokaż mi, że ten nie działa

s = 'hello'
s.object_id
s = s + ' world'
s.object_id 

W powyższym przypadku object_id będzie różne w dwóch przypadkach.

Odpowiedzi:


166

Możesz użyć, <<aby dołączyć do ciągu w miejscu.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true

1
Jak się masz <<! "bar", jak w celu zmodyfikowania stanu obiektu? concat! ("bar") nie działa ...
xxjjnn

@RainbowPony Jak pokazuje moja odpowiedź, <<już modyfikuje stan obiektu. Tak też concat.
wrzesień

Nie zawsze: irb (main): 038: 0> widget.notes.where (: author_id => a) .first.message.concat ("Potato") => "Y halo thar! = DPotato" irb (main): 039: 0> widget.notes.where (: author_id => a) .first.message => Widget "Y halo thar! = D" # jest instancją Widżetu. Może mieć notatki. wiadomość jest attr_accessible.
xxjjnn

1
@RainbowPony Tak, zawsze. W twoim przypadku otrzymujesz niezmieniony ciąg, ponieważ widget.notes.where(:author_id => a).firstprzypuszczalnie za każdym razem zwraca nowy obiekt, który będzie miał swój własny niezależny ciąg.
wrzesień

Ach. Właśnie zadałem nowe pytanie stackoverflow.com/questions/13989619/… dzięki za pomoc!
xxjjnn

56

możesz również skorzystać z:

s.concat("world")

4
<<powinno być również możliwe do utworzenia łańcucha, ponieważ zwraca łańcuch.
scottysseus

Rzeczywiście - i << jest również krótsze do napisania AND wygląda podobnie do wariantu C ++ cout. << to piękno!
shevy

1
Uwaga: to modyfikuje oryginalny ciąg. Używaj ostrożnie.
Damien Roche

3

Czy mogę zapytać, dlaczego to jest ważne?

Wiem, że nie jest to bezpośrednia odpowiedź na twoje pytanie, ale fakt, że próbujesz zachować identyfikator obiektu łańcucha, może wskazywać, że powinieneś ponownie przyjrzeć się temu, co próbujesz zrobić.

Może się na przykład okazać, że poleganie na identyfikatorze obiektu w łańcuchu prowadzi do błędów, które są dość trudne do wyśledzenia.


4
Może zmodyfikować parametry przez odniesienie? (co jest prawdopodobnie złym projektem w pełnoprawnym języku
OOP

4
A może po prostu unikniesz tworzenia zbyt wielu nowych obiektów? To całkiem rozsądne.
James A. Rosen

1
Z pewnością, jeśli zmodyfikujesz ciąg w miejscu i zostanie utworzony nowy obiekt, to stary obiekt zostanie usunięty? Czy naprawdę powinniśmy się martwić liczbą tworzonych obiektów String?
Shadowfirebird

@Shadowfirebird Może pisze metodę, która jest wywoływana tysiącami razy na sekundę i nie chce obciążać swojego śmieciarza zbiorem łańcuchów.
Michael Dorst,


1

Oto inny sposób:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.