Добавление к существующей строке

104

Я делаю это для добавления к существующей строке.

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

Есть ли лучший способ добавить к существующей строке.

Прежде чем кто-то предложит следующий ответ, дайте мне показать, что этот не работает

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

В приведенном выше случае object_id будет различным для двух случаев.

Нирадж Сингх
источник

Ответы:

166

Вы можете использовать <<для добавления к строке на месте.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true
sepp2k
источник
1
Как поживаешь <<! "бар", как изменить состояние объекта? 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. На нем могут быть заметки. сообщение attr_accessible.
xxjjnn
1
@RainbowPony Да, всегда. В вашем случае вы возвращаете неизмененную строку, потому что widget.notes.where(:author_id => a).firstпредположительно каждый раз возвращает новый объект, который будет иметь свою собственную независимую строку.
sepp2k
Ах. Я только что задал новый вопрос stackoverflow.com/questions/13989619/… спасибо за помощь!
xxjjnn
56

вы также можете использовать следующее:

s.concat("world")
Джу Ногейра
источник
4
<<также должен быть цепочкой, так как он возвращает строку.
Скоттиссей
В самом деле - и << также короче писать И похоже на вариант C ++ cout. << это красота!
shevy
1
Примечание: это изменяет исходную строку. Используйте осторожно.
Дэмиен Рош
3

Могу я спросить, почему это важно?

Я знаю, что это не прямой ответ на ваш вопрос, но тот факт, что вы пытаетесь сохранить идентификатор объекта строки, может указывать на то, что вам следует еще раз взглянуть на то, что вы пытаетесь сделать.

Например, вы можете обнаружить, что использование идентификатора объекта в строке приведет к ошибкам, которые довольно сложно отследить.

Shadowfirebird
источник
4
Может быть, изменить параметры по ссылке? (что, вероятно, плохой дизайн на полноценном языке
oop
4
Или просто чтобы не создавать слишком много новых объектов? Это совершенно разумно.
Джеймс А. Розен
1
Конечно, если вы измените строку на месте и будет создан новый объект, тогда старый объект будет собран в мусор? Стоит ли нам действительно беспокоиться о количестве создаваемых нами объектов String?
Shadowfirebird 01
@Shadowfirebird Может быть, он пишет метод, который вызывается 1000 раз в секунду и не хочет загружать свой сборщик мусора кучей строк.
Michael Dorst
2

Еще один способ:

s.insert(-1, ' world')
бхарата
источник
1

Вот еще один способ:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
ЧакСалдана
источник