Додавання до існуючого рядка


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 ("Картопля") => "Y halo thar! = DPotato" irb (main): 039: 0> widget.notes.where (: author_id => a) .first.message => "Y halo thar! = D" # віджет є примірником Widget. Він може мати ноти. повідомлення є attr_accessible.
xxjjnn

1
@RainbowPony Так, завжди. У вашому випадку ви отримуєте назад незмінний рядок, оскільки, widget.notes.where(:author_id => a).firstймовірно, кожен раз повертає новий об'єкт, який матиме власну незалежну рядок.
sepp2k

Ага. Щойно я задав нове запитання stackoverflow.com/questions/13989619/… дякую за допомогу!
xxjjnn

56

Ви також можете скористатися наступним:

s.concat("world")

4
<<також слід змінювати, оскільки він повертає рядок.
scottysseus

Дійсно - і << також коротше писати І схоже на варіант Cout + cout. << це краса!
shevy

1
Примітка. Це змінює початковий рядок. Використовуйте обережно.
Дамієн Рош

3

Чи можу я запитати, чому це важливо?

Я знаю, що це не пряма відповідь на ваше запитання, але той факт, що ви намагаєтесь зберегти ідентифікатор об'єкта рядка, може свідчити про те, що ви повинні знову переглянути те, що ви намагаєтеся зробити.

Ви можете виявити, наприклад, що посилання на ідентифікатор об'єкта рядка призведе до помилок, які досить важко знайти.


4
Може бути, змінити параметри за посиланням? (що, ймовірно, поганий дизайн повноцінною мовою
oop

4
Або просто уникати створення занадто багато нових об’єктів? Це цілком розумно.
Джеймс А. Росен

1
Напевно, якщо ви змінили рядок на місці і створили новий об’єкт, то старий об’єкт збирає сміття? Чи варто насправді турбуватися про кількість створених нами об'єктів String?
Shadowfirebird

@Shadowfirebird Можливо, він пише метод, який викликається 1000 разів на секунду і не хоче забивати його сміттєзбірником купою струн.
Майкл Дорст


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.