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
endEncore 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
falseEt 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
82079520Avec 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 StringEt 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
=> falseSource (pdf) toruby
Edit du 1er décembre 2013 Cette fonctionnalité a été supprimé dans la version 2.1.0-preview2.
À demain.