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