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


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

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

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

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

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


4
Может быть, изменить параметры по ссылке? (что, вероятно, плохой дизайн на полноценном языке
oop

4
Или просто чтобы не создавать слишком много новых объектов? Это совершенно разумно.
Джеймс А. Розен

1
Конечно, если вы измените строку на месте и будет создан новый объект, тогда старый объект будет собран в мусор? Стоит ли нам действительно беспокоиться о количестве создаваемых нами объектов String?
Shadowfirebird 01

@Shadowfirebird Может быть, он пишет метод, который вызывается 1000 раз в секунду и не хочет загружать свой сборщик мусора кучей строк.
Michael Dorst


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.