我正在浏览博客,发现以下代码段:
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
答案 0 :(得分:4)
MRI堆在该地址存储RValue
结构,其中第一个字段是标志,其中有一个位FL_FREEZE
,表示对象是否被冻结 - 整数中的第11位,x86字节反向顺序,因此可以作为第二个字节的第3位进行访问。
代码将该位设置为零,从而“解冻”对象