#ruby #ruby-2.7
#ruby #ruby-2.7
Вопрос:
Мне любопытно. Удивительно ли, что приведенный ниже фрагмент выдает FrozenError
? Волшебный комментарий # frozen_string_literal: true
отсутствует.
n = nil
s = n.to_s
s.force_encoding('UTF-8')
Комментарии:
1. Какая версия Ruby? И какая строка вызывает ошибку?
2. Я в замешательстве. Почему наличие или отсутствие
# frozen_string_literal: true
имеет значение?
Ответ №1:
Это было добавлено в Ruby 2.7 — Это явно задокументировано в примечаниях к выпуску.
Module#name
,true.to_s
,false.to_s
иnil.to_s
теперь всегда возвращает замороженную строку. Возвращаемая строка всегда одна и та же для данного объекта. [Экспериментальный] [Функция # 16150]
Связанная проблема имеет дополнительные причины для изменения:
Большую часть времени, когда пользователь вызывает
to_s
, они просто ищут простое строковое представление для отображения или интерполяции в другую строку. В моем кратком исследовании результатto_s
редко изменяется напрямую.Кажется, что мы могли бы сэкономить много объектов, предоставив способ явного запроса замороженной строки. … Это значительно сократило бы выделение строк при применении ко многим обычным вызовам to_s.
Таким образом, это уменьшает выделение объектов, что снижает накладные расходы на сборку мусора, что повышает производительность.