3

我正在浏览一个博客,发现以下代码片段:

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
4

1 回答 1

4

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

代码将该位设置为零,从而“解冻”对象

于 2016-02-04T07:32:21.067 回答