nil.to_s生成冻结字符串



我很好奇。下面的代码片段产生了一个FrozenError,这令人惊讶吗?魔术注释# frozen_string_literal: true不存在。

n = nil
s = n.to_s
s.force_encoding('UTF-8')

这是在Ruby 2.7中添加的——它在发行说明中有明确的记录。

Module#nametrue.to_sfalse.to_snil.to_s现在总是返回一个冻结的字符串。对于给定的对象,返回的String总是相同的。【实验】【功能#16150】

关联问题在更改背后有其他原因:

大多数时候,当用户调用to_s时,他们只是在寻找一个简单的字符串表示来显示或插入到另一个字符串中。在我的简短探索中,to_s的结果很少直接突变。

似乎我们可以通过提供一种显式请求冻结字符串的方法来保存很多对象。。。。当应用于许多常见的to_s调用时,这将显著减少字符串分配。

总之,它减少了对象分配,从而减少了垃圾收集开销,从而提高了性能。

最新更新