nil.to_s 产生一个冻结的字符串?

Lar*_*rth 6 ruby ruby-2.7

我很好奇。下面的代码片段产生一个FrozenError? 神奇的评论# frozen_string_literal: true不存在。

n = nil
s = n.to_s
s.force_encoding('UTF-8')
Run Code Online (Sandbox Code Playgroud)

Joh*_*ter 10

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

Module#name, true.to_s, false.to_s,nil.to_s现在总是返回一个冻结的字符串。对于给定的对象,返回的字符串始终相同。[实验] [功能#16150 ]

链接的问题在更改背后有其他原因:

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

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

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