Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Du nouveau dans Ruby 2.1: Le suffixe f pour les chaînes de caractères

| Comments

Niveau : facile

Aujourd’hui c’est au tour du nouveau suffixe f (comme frozen) d’être passé en revue.

Avant Ruby 2.1

Les chaînes de caractères en Ruby sont des objets mutables. Ce qui signifie qu’à chaque fois que l’interpréteur rencontre "foo", il crée un nouvel objet:

[~]⇒ rvm use 2.0.0
[~]⇒ irb
>> "foo".object_id
74667700
>> "foo".object_id
74664050

Ce qui peut influer sur les performances d’un programme quand on compare beaucoup de chaînes. Voici un exemple trivial:

1
2
3
4
5
def foo?(string)
  foo = "foo"
  p foo.object_id
  string == foo
end

Encore une fois, on peut constater qu’un nouvel objet est créé à chaque appel de la méthode:

1
2
3
4
5
6
>> foo? "bépo"
76675080
false
>> foo? "bar"
76669680
false

Et géler (freeze) l’objet n’empêchera pas sa création à chaque appel:

1
2
3
4
5
6
7
8
9
>> def foo
>>   foo = "foo".freeze
>>   foo.object_id
>> end
nil
>> foo
82081130
>> foo
82079520

Avec Ruby 2.1

[~]⇒ rvm use 2.1.0-preview1
[~]⇒ irb

Le suffixe f permet de géler (freeze) les chaînes de caractères:

1
2
3
4
>> a = "foo"f
=> "foo"
>> a.reverse!
RuntimeError: can't modify frozen String

Et surtout, le suffixe f les gèlent une fois pour toutes. L’exemple précédent donne ceci:

1
2
3
4
5
6
7
8
9
10
11
12
>> def foo?(string)
>>   foo = "foo"f
>>   p foo.object_id
>>   string == foo
>> end
=> :foo?
>> foo? "bépo"
79029020
=> false
>> foo? "bar"
79029020
=> false

Source (pdf) toruby

Edit du 1er décembre 2013 Cette fonctionnalité a été supprimé dans la version 2.1.0-preview2.

À demain.

Articles connexes

Commentaires