Ajout à une chaîne existante

104

Pour ajouter à une chaîne existante, c'est ce que je fais.

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

Existe-t-il un meilleur moyen d'ajouter à une chaîne existante.

Avant que quelqu'un ne suggère la réponse suivante, laissez-moi montrer que celle-ci ne fonctionne pas

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

Dans le cas ci-dessus, object_id sera différent dans deux cas.

Neeraj Singh
la source

Réponses:

166

Vous pouvez utiliser <<pour ajouter à une chaîne sur place.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true
sepp2k
la source
1
Comment faites-vous s <<! "bar", comme pour modifier l'état de l'objet? concat! ("bar") does not work ...
xxjjnn
@RainbowPony Comme le montre ma réponse, <<modifie déjà l'état de l'objet. Il en va de même concat.
sepp2k
Pas toujours: 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 est une instance de Widget. Il peut avoir des notes. le message est attr_accessible.
xxjjnn
1
@RainbowPony Oui, toujours. Dans votre cas, vous récupérez la chaîne inchangée car widget.notes.where(:author_id => a).firstretourne vraisemblablement un nouvel objet à chaque fois, qui aura sa propre chaîne indépendante.
sepp2k
Ah. Je viens de poser une nouvelle question stackoverflow.com/questions/13989619/ ... merci pour l'aide!
xxjjnn
56

vous pouvez également utiliser les éléments suivants:

s.concat("world")
Ju Nogueira
la source
4
<<devrait également pouvoir être chaîné, car il renvoie la chaîne.
scottysseus le
En effet - et << est également plus court à écrire ET ressemble à la variante cout C ++. << c'est la beauté!
shevy
1
Remarque: cela modifie la chaîne d'origine. Utilisez avec précaution.
Damien Roche
3

Puis-je demander pourquoi c'est important?

Je sais que ce n'est pas une réponse directe à votre question, mais le fait que vous essayez de conserver l'identifiant d'objet d'une chaîne peut indiquer que vous devriez revoir ce que vous essayez de faire.

Vous pourriez constater, par exemple, que le fait de s'appuyer sur l'ID d'objet d'une chaîne entraînera des bogues assez difficiles à détecter.

Shadowfirebird
la source
4
Peut-être modifier les paramètres par référence? (ce qui est probablement une mauvaise conception dans un langage oop à part entière)
hurikhan77
4
Ou simplement pour éviter de créer trop de nouveaux objets? C'est parfaitement raisonnable.
James A. Rosen
1
Si vous modifiez une chaîne sur place et qu'un nouvel objet est créé, alors l'ancien objet est récupéré? Doit-on vraiment s'inquiéter du nombre d'objets String que nous créons?
Shadowfirebird
@Shadowfirebird Peut-être qu'il écrit une méthode qui est appelée des milliers de fois par seconde et ne veut pas enliser son ramasse-miettes avec un tas de chaînes.
Michael Dorst
2

Encore une autre façon:

s.insert(-1, ' world')
bharat
la source
1

Voici une autre façon:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
mandrinSaldana
la source