# frozen_string_literal: true
это магический комментарий, впервые поддерживаемый в Ruby 2.3, который сообщает Ruby, что все строковые литералы в файле неявно заморожены, как если бы #freeze
они были вызваны для каждого из них. То есть, если строковый литерал определен в файле с этим комментарием, и вы вызываете метод для этой строки, который изменяет его, например <<
, вы получитеRuntimeError: can't modify frozen String
.
Комментарий должен быть в первой строке файла.
В Ruby 2.3 этот магический комментарий можно использовать для подготовки к фиксированным строковым литералам, которые по умолчанию используются в Ruby 3 .
В Ruby 2.3 запускается с --enable=frozen-string-literal
флагом, а в Ruby 3 строковые литералы фиксируются во всех файлах. Вы можете переопределить глобальные настройки с помощью # frozen_string_literal: false
.
Если вы хотите, чтобы строковый литерал был изменяемым независимо от глобальных или файловых настроек, вы можете поставить перед ним префиксный унарный +
оператор (будьте осторожны с приоритетом оператора) или вызвать .dup
его:
# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false
Вы также можете заморозить изменяемую (незамерзшую) строку с помощью одинарного кода -
.
-"foo"
того же"foo".freeze
? Когда я проверяю,(-"foo").__id__
я каждый раз получаю другое значение, но"foo".freeze.__id__
оно всегда одинаково. Любые идеи?-
предназначен для дедупликации строки для экономии памяти, в дополнение к возврату замороженной строки.Это повышает производительность приложения, не выделяя новое пространство для той же строки, тем самым экономя время на сборку мусора. Как? когда вы замораживаете строковый литерал (строковый объект), вы говорите Ruby, чтобы ни одна из ваших программ не изменяла строковый литерал (объект).
Несколько очевидных наблюдений, которые нужно иметь в виду.
1. Замораживая строковые литералы, вы не выделяете для этого новое пространство памяти.
Пример:
Без волшебного комментария выделяется новое пространство для той же строки (обратите внимание на разные идентификаторы объекта)
С волшебным комментарием , рубин выделяет место только один раз
2. Замораживая строковые литералы, ваша программа вызовет исключение при попытке изменить строковый литерал.
Пример:
Без магического комментария вы можете изменить строковые литералы.
С волшебным комментарием , будет возникать исключение, когда вы изменяете строковые литералы
Всегда есть чему поучиться и быть гибким:
источник
В Ruby 3.0. Matz (создатель Ruby) решил сделать все строковые литералы замороженными по умолчанию.
Вы можете использовать в Ruby 2.x. Просто добавьте этот комментарий в первую строку ваших файлов.
Пожалуйста, прочитайте эту тему для получения дополнительной информации.
https://bugs.ruby-lang.org/issues/8976
источник