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

标签 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

最佳答案

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

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

关于Ruby 我们如何使用指针解冻字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194751/

相关文章:

json - 在Go中检查嵌套指针结构是否为nil的简便方法?

python - 通过 Nibabel 加载 Nifti 并使用形状函数

ruby - 如何使用 rspec 测试 CLI 的标准输入

ruby-on-rails - 如何在 Ruby 中动态打开一个方法

c++ - 对象调用对象

c++ - 以子类的实例为参数的重载子类函数,如何使用?

ruby - 为什么 ruby​​ 在这里需要括号?

ruby - MRI ruby​​ 线程和性能

ruby-on-rails - 如何根据另一个包含索引的数组对数组进行排序

ruby - Ruby 的 pdftk 包装器