追加到现有字符串


104

要添加到现有字符串,这就是我正在做的事情。

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

有没有更好的方法来追加到现有字符串。

在有人提出以下答案之前,lemme表明该行不通

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

在上述情况下,object_id在两种情况下会有所不同。

Answers:


166

您可以使用<<原位附加到字符串。

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

1
你好,<<!“ bar”,就像在修改对象的状态一样?concat!(“ bar”)无效...
xxjjnn 2012年

@RainbowPony如我的答案所示,<<已经修改了对象的状态。也是concat
sepp2k 2012年

并不总是这样: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的实例。它可以有笔记。消息是attr_accessible。
xxjjnn 2012年

1
@RainbowPony是的,总是这样。在您的情况下,您将返回未更改的字符串,因为widget.notes.where(:author_id => a).first大概每次都返回一个新对象,该对象将具有自己的独立字符串。
sepp2k 2012年

啊。我刚刚问了一个新问题stackoverflow.com/questions/13989619/…感谢您的帮助!
xxjjnn,2012年


3

请问为什么这很重要?

我知道这不是您问题的直接答案,但是您尝试保留字符串的对象ID的事实可能表明您应该再次查看尝试做的事情。

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


4
也许通过引用修改参数?(在完整的oop语言中可能是不良的设计)
hurikhan77 2010年

4
还是只是为了避免创建太多新对象?那是完全合理的。
James A. Rosen

1
当然,如果您修改了一个字符串并创建了一个新对象,那么旧对象会被垃圾回收?我们真的应该担心我们创建的String对象的数量吗?
Shadowfirebird

@Shadowfirebird也许他正在写一个每秒被调用1000次的方法,并且不想用一堆字符串来破坏他的垃圾收集器。
迈克尔·多斯特


1

这是另一种方式:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.