# frozen_string_literal: true
est un commentaire magique, pris en charge pour la première fois dans Ruby 2.3, qui indique à Ruby que tous les littéraux de chaîne dans le fichier sont implicitement figés, comme s'ils #freeze
avaient été appelés sur chacun d'eux. Autrement dit, si un littéral de chaîne est défini dans un fichier avec ce commentaire, et que vous appelez une méthode sur cette chaîne qui la modifie, par exemple <<
, vous obtiendrez RuntimeError: can't modify frozen String
.
Le commentaire doit figurer sur la première ligne du fichier.
Dans Ruby 2.3, vous pouvez utiliser ce commentaire magique pour vous préparer à ce que les littéraux de chaîne figés soient la valeur par défaut dans Ruby 3 .
Dans Ruby 2.3 exécuté avec l' --enable=frozen-string-literal
indicateur, et dans Ruby 3, les littéraux de chaîne sont figés dans tous les fichiers. Vous pouvez remplacer le paramètre global avec # frozen_string_literal: false
.
Si vous voulez qu'un littéral de chaîne soit modifiable quel que soit le paramètre global ou par fichier, vous pouvez le préfixer avec l' +
opérateur unaire (en faisant attention à la priorité de l'opérateur) ou l'appeler .dup
:
# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false
Vous pouvez également geler une chaîne modifiable (non gelée) avec unaire -
.
Dave Schweisguth
la source
-"foo"
à être le même que"foo".freeze
? Lorsque je vérifie,(-"foo").__id__
j'obtiens une valeur différente à chaque fois, mais elle"foo".freeze.__id__
est la même à chaque fois. Des idées?-
sert à dédupliquer la chaîne pour économiser de la mémoire, en plus de renvoyer une chaîne figée.Il améliore les performances des applications en n'allouant pas de nouvel espace pour la même chaîne, ce qui permet également de gagner du temps pour les tâches de récupération de place. Comment? lorsque vous figez un littéral de chaîne (objet chaîne), vous dites à Ruby de ne laisser aucun de vos programmes modifier le littéral de chaîne (objet).
Quelques observations évidentes à garder à l'esprit.
1. En gelant les littéraux de chaîne, vous ne lui allouez pas de nouvel espace mémoire.
Exemple:
Sans commentaire magique alloue un nouvel espace pour la même chaîne (Observez les différents ID d'objet imprimés)
Avec un commentaire magique , ruby alloue de l'espace une seule fois
2. En gelant les littéraux de chaîne, votre programme lèvera une exception lors de la tentative de modification du littéral de chaîne.
Exemple:
Sans commentaire magique , vous pouvez modifier les littéraux de chaîne.
Avec un commentaire magique , une exception sera levée lorsque vous modifiez les littéraux de chaîne
Il y a toujours plus à apprendre et à être flexible:
la source
Dans Ruby 3.0. Matz (le créateur de Ruby) a décidé de rendre tous les littéraux String figés par défaut.
Vous pouvez utiliser dans Ruby 2.x. Ajoutez simplement ce commentaire dans la première ligne de vos fichiers.
Veuillez lire ce sujet pour plus d'informations.
https://bugs.ruby-lang.org/issues/8976
la source