# frozen_string_literal: true
to magiczny komentarz, obsługiwany po raz pierwszy w Ruby 2.3, który mówi Ruby'emu, że wszystkie literały łańcuchowe w pliku są domyślnie zawieszone, jakby #freeze
zostały wywołane na każdym z nich. To znaczy, jeśli dosłowny ciąg znaków jest zdefiniowany w pliku z tym komentarzem i wywołujesz metodę na tym ciągu, która go modyfikuje, na przykład <<
otrzymasz RuntimeError: can't modify frozen String
.
Komentarz musi znajdować się w pierwszym wierszu pliku.
W Ruby 2.3 możesz użyć tego magicznego komentarza do przygotowania zamrożonych literałów łańcuchowych, które są domyślne w Ruby 3 .
W Ruby 2.3 uruchamianym z --enable=frozen-string-literal
flagą, aw Ruby 3 literały łańcuchowe są zamrażane we wszystkich plikach. Możesz zastąpić ustawienie globalne za pomocą # frozen_string_literal: false
.
Jeśli chcesz, aby literał łańcuchowy był modyfikowalny niezależnie od ustawienia globalnego lub dla poszczególnych plików, możesz poprzedzić go jednoargumentowym +
operatorem (uważając na pierwszeństwo operatora) lub wywołać .dup
go:
# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false
Możesz także zamrozić zmienny (niezamrożony) ciąg z unarnym -
.
-"foo"
sami jak"foo".freeze
? Kiedy sprawdzam(-"foo").__id__
, za każdym razem otrzymuję inną wartość, ale za"foo".freeze.__id__
każdym razem jest taka sama. Jakieś pomysły?-
służy do deduplikacji ciągu w celu zaoszczędzenia pamięci, oprócz zwracania zamrożonego ciągu.Poprawia wydajność aplikacji, nie przydzielając nowego miejsca dla tego samego łańcucha, a tym samym oszczędzając czas na prace związane z odśmiecaniem. W jaki sposób? kiedy zamrażasz literał łańcuchowy (obiekt łańcuchowy), mówisz Ruby'owi, aby żaden program nie modyfikował literału łańcuchowego (obiekt).
Kilka oczywistych spostrzeżeń, o których należy pamiętać.
1. Zamrażając literały łańcuchowe, nie przydzielasz dla niej nowej przestrzeni pamięci.
Przykład:
Bez magicznego komentarza przydziela nowe miejsce dla tego samego łańcucha (Obserwuj różne wydrukowane identyfikatory obiektów)
Z magicznym komentarzem ruby przydziela przestrzeń tylko raz
2. Zamrażając literały łańcuchowe, twój program zgłosi wyjątek podczas próby modyfikacji literałów łańcuchowych.
Przykład:
Bez magicznego komentarza możesz modyfikować literały łańcuchowe.
Z magicznym komentarzem powstanie wyjątek podczas modyfikowania literałów łańcuchowych
Zawsze musisz nauczyć się więcej i być elastycznym:
źródło
W Ruby 3.0. Matz (twórca Ruby) postanowił domyślnie zamrozić wszystkie literały String.
Możesz używać w Ruby 2.x. Po prostu dodaj ten komentarz w pierwszym wierszu swoich plików.
Proszę, przeczytaj ten temat, aby uzyskać więcej informacji.
https://bugs.ruby-lang.org/issues/8976
źródło