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.

Neeraj Singh
źródło

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
sepp2k
źródło
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")
Ju Nogueira
źródło
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.

Shadowfirebird
źródło
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,
2

Jeszcze inny sposób:

s.insert(-1, ' world')
bharath
źródło
1

Oto inny sposób:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
chuckSaldana
źródło