OpenStruct
использует комбинацию define_method
вызовов внутри чека unless self.respond_to?(name)
и method_missing
.Это означает, что если имя свойства конфликтует с именем любого существующего метода объекта, то вы столкнетесь с этой проблемой.
tokland ответ, если это хорошо, но другой альтернативой является отмена определения id
метод, например
test.instance_eval('undef id')
Вы также можете включить это в свою собственную версию OpenStruct
, например,
class OpenStruct2 < OpenStruct
undef id
end
irb(main):009:0> test2 = OpenStruct2.new({:id => 666})
=> #<OpenStruct2 id=666>
irb(main):010:0> test2.id
=> 666