追加到现有字符串

111

以下是我追加字符串的方法。

s = 'hello'
s.gsub!(/$/, ' world');
有没有一种更好的方法来追加到现有字符串中?
在有人建议以下答案之前,让我展示一下这个不起作用的答案。
s = 'hello'
s.object_id
s = s + ' world'
s.object_id 
在上述情况下,对于两种情况,object_id将是不同的。
5个回答

176
你可以使用<<来原地追加字符串。
s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true

1
你如何使用 s <<! "bar" 修改对象的状态?concat!("bar") 无效... - xxjjnn
@RainbowPony,正如我的回答所示,“<<”已经修改了对象的状态。concat 也是如此。 - sepp2k
不总是这样的: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 是 Widget 的一个实例。它可以有 notes。message 是 attr_accessible。 - xxjjnn
1
@RainbowPony 是的,一直都是这样。在你的情况中,你将得到未更改的字符串,因为 widget.notes.where(:author_id => a).first 可能每次都会返回一个新的对象,该对象将具有其自己独立的字符串。 - sepp2k
啊,我刚刚提了一个新问题http://stackoverflow.com/questions/13989619/ruby-concat-or-how-to-modify-state-of-object-elegantly,感谢您的帮助! - xxjjnn

61

您也可以使用以下方法:

s.concat("world")

4
"should be chainable as well, since it returns the string." 的意思是:“由于函数返回字符串,应该也能够链式调用。” - scottysseus
确实-并且<<也更短,看起来类似于C++ cout变体。<<很美! - shevy
1
注意:这会修改原始字符串。请谨慎使用。 - Damien Roche

3

我可以问一下为什么这很重要吗?

我知道这不是你问题的直接答案,但你试图保留字符串的对象ID可能表明你应该重新审视你正在尝试做的事情。

例如,你可能会发现依赖字符串的对象ID会导致很难跟踪的错误。


4
也许可以通过引用修改参数?(这在一个完整的面向对象编程语言中可能是不良设计) - hurikhan77
4
还是为了避免创建过多的新对象?那是完全合理的。 - James A. Rosen
1
如果您在原地修改字符串并创建了一个新对象,那么旧对象会被垃圾回收,这是肯定的吧?我们真的需要担心我们创建的字符串对象数量吗? - Shadowfirebird
也许他正在编写一个被调用数千次每秒的方法,并且不想用一堆字符串拖慢垃圾收集器。 - Michael Dorst

2
另一种方式:

还有另一种方法:

s.insert(-1, ' world')

1
这里还有另一种方法:
fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接