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

问题描述

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

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

解决方法

它是在Ruby 2.7中添加的-在release notes中有明确记录。

Module#nametrue.to_sfalse.to_snil.to_s现在总是返回冻结的字符串。对于给定的对象,返回的String始终相同。 [实验] [Feature #16150]

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

在用户调用to_s的大部分时间里,他们只是在寻找一个简单的字符串表示形式来显示或插值到另一个字符串中。在我的简要探索中,to_s的结果很少直接突变。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...