我浏览了一个博客,发现了以下代码片段:
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 位进行访问。
代码将该位设置为零,从而“解冻”对象
关于Ruby 我们如何使用指针解冻字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194751/