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.

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

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")

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.


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


1

Voici une autre façon:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.