Ruby Как мы можем разморозить строку, используя указатель
Я просматривал блог и нашел следующий фрагмент кода:
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 ответ
Решение
МРТ куча магазинов RValue
структура по этому адресу, первое поле которого флаги, который имеет бит FL_FREEZE
указывающий, заморожен ли объект - 11-й бит в целом числе в байтах x86 идет в обратном порядке, поэтому к нему можно обращаться как к 3-му биту второго байта.
Код устанавливает этот бит в ноль, таким образом "размораживая" объект