# frozen_string_literal: true
ist ein magischer Kommentar, der zum ersten Mal in Ruby 2.3 unterstützt wird und Ruby mitteilt, dass alle String-Literale in der Datei implizit eingefroren sind, als ob #freeze
sie für jeden von ihnen aufgerufen worden wären . Das heißt, wenn ein String - Literal in einer Datei mit diesem Kommentar definiert ist, und Sie rufen eine Methode auf diesem String, ändert es, wie <<
, die Sie erhalten RuntimeError: can't modify frozen String
.
Der Kommentar muss in der ersten Zeile der Datei stehen.
In Ruby 2.3 können Sie diesen magischen Kommentar verwenden , um sich darauf vorzubereiten, dass eingefrorene Zeichenfolgenliterale in Ruby 3 die Standardeinstellung sind .
In Ruby 2.3, das mit dem --enable=frozen-string-literal
Flag ausgeführt wird, und in Ruby 3 werden Zeichenfolgenliterale in allen Dateien eingefroren. Sie können die globale Einstellung mit überschreiben # frozen_string_literal: false
.
Wenn Sie möchten, dass ein Zeichenfolgenliteral unabhängig von der globalen Einstellung oder der Einstellung pro Datei veränderbar ist, können Sie ihm den unären +
Operator voranstellen (wobei Sie auf die Priorität des Operators achten) oder ihn aufrufen .dup
:
# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false
Sie können auch eine veränderbare (nicht gefrorene) Zeichenfolge mit unary einfrieren -
.
-"foo"
, dass es dasselbe ist wie"foo".freeze
? Wenn ich nachschaue,(-"foo").__id__
erhalte ich jedes Mal einen anderen Wert, der jedoch"foo".freeze.__id__
jedes Mal gleich ist. Irgendwelche Ideen?-
dient zum Deduplizieren des Strings, um Speicherplatz zu sparen, und zum Zurückgeben eines eingefrorenen Strings.Es verbessert die Anwendungsleistung, indem nicht neuer Speicherplatz für dieselbe Zeichenfolge zugewiesen wird, wodurch auch Zeit für die Speicherbereinigung gespart wird. Wie? Wenn Sie ein String-Literal (String-Objekt) einfrieren, weisen Sie Ruby an, dass keines Ihrer Programme das String-Literal (Objekt) ändern darf.
Einige offensichtliche Beobachtungen zu beachten.
1. Indem Sie String-Literale einfrieren, weisen Sie keinen neuen Speicherplatz dafür zu.
Beispiel:
Ohne magischen Kommentar wird der gleichen Zeichenfolge neuer Speicherplatz zugewiesen (Beachten Sie die verschiedenen gedruckten Objekt-IDs).
Mit einem magischen Kommentar weist Ruby nur einmal Speicherplatz zu
2. Wenn Sie String-Literale einfrieren, löst Ihr Programm eine Ausnahme aus, wenn Sie versuchen, das String-Literal zu ändern.
Beispiel:
Ohne magischen Kommentar können Sie die Zeichenfolgenliterale ändern.
Bei einem magischen Kommentar wird eine Ausnahme ausgelöst, wenn Sie Zeichenfolgenliterale ändern
Es gibt immer mehr zu lernen und flexibel zu sein:
quelle
In Ruby 3.0. Matz (Rubys Schöpfer) hat beschlossen, alle String-Literale standardmäßig einzufrieren.
Sie können in Ruby 2.x verwenden. Fügen Sie diesen Kommentar einfach in die erste Zeile Ihrer Dateien ein.
Bitte lesen Sie dieses Thema für weitere Informationen.
https://bugs.ruby-lang.org/issues/8976
quelle