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.

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

Другие вопросы по тегам