Du nouveau dans Ruby 2.1: Le suffixe f pour les chaînes de caractères
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:
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:
>> foo? "bépo"
76675080
false
>> foo? "bar"
76669680
false
Et géler (freeze) l’objet n’empêchera pas sa création à chaque appel:
>> 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:
>> 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:
>> 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.