Mevcut bir dizeye ekleme


104

Mevcut bir dizgeye eklemek için bunu yapıyorum.

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

Mevcut bir dizgeye eklemenin daha iyi bir yolu var mı?

Birisi aşağıdaki cevabı önermeden önce, bunun işe yaramadığını gösterin

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

Yukarıdaki durumda, object_id iki durum için farklı olacaktır.

Yanıtlar:


166

<<Yerinde bir dizeye eklemek için kullanabilirsiniz .

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

1
Nasıl yaparsın <<! "bar", nesnenin durumunu değiştirmek için olduğu gibi? concat! ("bar") çalışmıyor ...
xxjjnn

@RainbowPony Cevabımın gösterdiği gibi, <<zaten nesnenin durumunu değiştiriyor. Öyle concat.
sepp2k

Her zaman değil: irb (ana): 038: 0> widget.notes.where (: author_id => a) .first.message.concat ("Patates") => "Y halo thar! = DPotato" irb (ana): 039: 0> widget.notes.where (: author_id => a) .first.message => "Y halo thar! = D" # widget bir Widget örneğidir. Notları olabilir. mesaj attr_accessible.
xxjjnn

1
@RainbowPony Evet, her zaman. Sizin durumunuzda, değişmemiş dizgeyi geri alırsınız, çünkü widget.notes.where(:author_id => a).firstmuhtemelen her seferinde kendi bağımsız dizesine sahip olacak yeni bir nesne döndürür.
sepp2k

Ah. Yeni bir soru sordum stackoverflow.com/questions/13989619/… Yardım için teşekkürler!
xxjjnn

56

ayrıca aşağıdakileri de kullanabilirsiniz:

s.concat("world")

4
<<dizeyi döndürdüğü için zincirlenebilir de olmalıdır.
scottysseus

Aslında - ve << ayrıca yazmak için daha kısadır VE C ++ cout değişkenine benzer görünür. << güzelliktir!
shevy

1
Not: Bu, orijinal dizeyi değiştirir. Dikkatli kullanın.
Damien Roche

3

Bunun neden önemli olduğunu sorabilir miyim?

Bunun sorunuzun doğrudan bir cevabı olmadığını biliyorum, ancak bir dizenin nesne kimliğini korumaya çalışmanız, yapmaya çalıştığınız şeye tekrar bakmanız gerektiğini gösterebilir.

Örneğin, bir dizenin nesne kimliğine güvenmenin, izlenmesi oldukça zor olan hatalara yol açacağını fark edebilirsiniz.


4
Parametreleri referans olarak değiştirmek ister misiniz? (tam teşekküllü bir oop dilinde muhtemelen kötü tasarım)
hurikhan77

4
Yoksa çok fazla yeni nesne oluşturmaktan kaçınmak için mi? Bu tamamen makul.
James A. Rosen

1
Elbette, bir dizeyi yerinde değiştirirseniz ve yeni bir nesne oluşturulursa, eski nesne çöp toplanır mı? Oluşturduğumuz String nesnelerinin sayısı hakkında gerçekten endişelenmeli miyiz?
Shadowfirebird

@Shadowfirebird Belki saniyede 1000 kez çağrılan bir yöntem yazıyor ve çöp toplayıcısını bir sürü dizeyle batırmak istemiyor.
Michael Dorst


1

İşte başka bir yol:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.