nil.to_s создает замороженную строку?

#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.

Таким образом, это уменьшает выделение объектов, что снижает накладные расходы на сборку мусора, что повышает производительность.