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

时间:2016-02-04 07:15:05

标签: ruby pointers mri

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

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

1 个答案:

答案 0 :(得分:4)

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

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