Menambahkan ke string yang sudah ada

104

Untuk menambahkan ke string yang ada, inilah yang saya lakukan.

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

Apakah ada cara yang lebih baik untuk menambahkan string yang sudah ada.

Sebelum seseorang menyarankan jawaban berikut biar tunjukkan bahwa yang ini tidak berfungsi

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

Dalam kasus di atas, object_id akan berbeda untuk dua kasus.

Neeraj Singh
sumber

Jawaban:

166

Anda dapat menggunakan <<untuk menambahkan string di tempat.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true
sepp2k.dll
sumber
1
Bagaimana Anda melakukannya s <<! "bar", untuk mengubah keadaan objek? concat! ("bar") tidak berfungsi ...
xxjjnn
@RainbowPony Seperti yang ditunjukkan jawaban saya, <<sudah memodifikasi status objek. Begitu juga concat.
sepp2k
Tidak selalu: 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 => "Y halo thar! = D" # widget adalah turunan dari Widget. Itu bisa memiliki catatan. message is attr_accessible.
xxjjnn
1
@RainbowPony Ya, selalu. Dalam kasus Anda, Anda mendapatkan kembali string yang tidak berubah karena widget.notes.where(:author_id => a).firstkemungkinan mengembalikan objek baru setiap kali, yang akan memiliki string independennya sendiri.
sepp2k
Ah. Saya baru saja mengajukan pertanyaan baru stackoverflow.com/questions/13989619/… terima kasih atas bantuannya!
xxjjnn
56

Anda juga dapat menggunakan berikut ini:

s.concat("world")
Ju Nogueira
sumber
4
<<harus dapat dirantai juga, karena mengembalikan string.
scottysseus
Memang - dan << juga lebih pendek untuk ditulis DAN terlihat mirip dengan varian C ++ cout. << adalah keindahan!
shevy
1
Catatan: ini mengubah string asli. Gunakan dengan hati-hati.
Damien Roche
3

Bolehkah saya bertanya mengapa ini penting?

Saya tahu bahwa ini bukanlah jawaban langsung untuk pertanyaan Anda, tetapi fakta bahwa Anda mencoba untuk mempertahankan ID objek dari sebuah string mungkin menunjukkan bahwa Anda harus melihat lagi pada apa yang Anda coba lakukan.

Anda mungkin menemukan, misalnya, bahwa mengandalkan ID objek dari sebuah string akan menyebabkan bug yang cukup sulit dilacak.

Shadowfirebird
sumber
4
Mungkin untuk mengubah parameter dengan referensi? (yang mungkin merupakan desain yang buruk dalam bahasa yang lengkap)
hurikhan77
4
Atau hanya untuk menghindari membuat terlalu banyak objek baru? Itu sangat masuk akal.
James A. Rosen
1
Tentunya jika Anda memodifikasi string di tempat dan objek baru dibuat, maka objek lama akan dikumpulkan sampah? Haruskah kita benar-benar mengkhawatirkan jumlah objek String yang kita buat?
Shadowfirebird
@Shadowfirebird Mungkin dia sedang menulis metode yang dipanggil 1000 kali per detik dan tidak ingin menghentikan pengumpul sampahnya dengan banyak string.
Michael Dorst
2

Namun cara lain:

s.insert(-1, ' world')
bharath
sumber
1

Berikut cara lain:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
chuckSaldana
sumber