40 votes

Les chaînes de caractères en Ruby sont-elles mutables ?

Considérons le code suivant :

$ irb
> s = "asd"
> s.object_id   # prints 2171223360
> s[0] = ?z     # s is now "zsd"
> s.object_id   # prints 2171223360 (same as before)
> s += "hello"  # s is now "zsdhello"
> s.object_id   # prints 2171224560 (now it's different)

Il semble que les caractères individuels peuvent être modifiés sans créer une nouvelle chaîne. Cependant, l'ajout à la chaîne de caractères crée apparemment une nouvelle chaîne.

Les chaînes de caractères en Ruby sont-elles mutables ?

50voto

maprihoda Points 5600

Oui, les chaînes de caractères en Ruby, contrairement à Python, sont mutables.

s += "hello" es no ajout de "hello" à s - un objet chaîne entièrement nouveau est créé. Pour ajouter à une chaîne de caractères "en place", utilisez << comme dans :

s = "hello"
s << "   world"
s # hello world

16voto

zed_0xff Points 12379
ruby-1.9.3-p0 :026 > s="foo"
 => "foo" 
ruby-1.9.3-p0 :027 > s.object_id
 => 70120944881780 
ruby-1.9.3-p0 :028 > s<<"bar"
 => "foobar" 
ruby-1.9.3-p0 :029 > s.object_id
 => 70120944881780 
ruby-1.9.3-p0 :031 > s+="xxx"
 => "foobarxxx" 
ruby-1.9.3-p0 :032 > s.object_id
 => 70120961479860 

donc, les chaînes de caractères sont mutables, mais += L'opérateur crée une nouvelle chaîne. << conserve les anciens

9voto

Oleg Mikheev Points 6566

Ajout d'un élément Ruby String n'est pas += c'est <<

Donc si vous changez += à << votre question est traitée par elle-même

7voto

hipertracker Points 1417

Les chaînes de caractères en Ruby sont mutables, mais vous pouvez les modifier en les gelant.

irb(main):001:0> s = "foo".freeze
=> "foo"
irb(main):002:0> s << "bar"
RuntimeError: can't modify frozen String

3voto

Faruk Hossen Points 119

Les chaînes de caractères Ruby sont mutables. Mais vous devez utiliser << pour la concaténation plutôt que +.
En fait, concaténer une chaîne avec
+ opérateur(immuable) car il crée un nouvel objet chaîne.
<< opérateur(mutable) car il change dans le même objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X