Ruby 我们如何使用指针解冻字符串

Ruby How we can unfreeze the string using pointer

我在浏览博客时发现了以下代码片段:

require 'fiddle'
str = 'water'.freeze
str.frozen? # true

memory_address = str.object_id * 2
Fiddle::Pointer.new(memory_address)[1] &= ~8
str.frozen? # false

谁能解释一下,我不明白下面这行实际上是如何解冻字符串的。

Fiddle::Pointer.new(memory_address)[1] &= ~8

MRI 堆在该地址存储 RValue 结构,该地址的第一个字段是标志,其中有位 FL_FREEZE 指示对象是否被冻结 - 整数中的第 11 位,以 x86 字节为单位以相反的顺序,所以它可以作为第二个字节的第 3 位访问。

代码将该位设置为零,因此 'unfreezing' 对象