Похоже, ошибка / ограничение OpenStruct в 1.8.7, где нет объекта BlankSlate, вызвано реализацией, которая использует method_missing
для определения, является ли это специальное свойство или нет.
Вотпользовательский класс, похожий на OpenStruct, который выполняет то, что вы запрашиваете в 1.8.7;не стесняйтесь расширять его и делать его более функциональным.
class MemoStruct
def initialize( h=nil )
h.each{ |k,v| add_field(k,v) } if h
end
def add_field( name, value=nil )
inst = :"@#{name}"
(class << self; self; end).class_eval do
define_method(name){ instance_variable_get inst }
define_method("#{name}="){ |v| instance_variable_set inst,v }
end
instance_variable_set(inst,value)
end
def []=( name, value )
add_field(name,value)
end
end
hash = MemoStruct.new :id=>123, :name=>"Jim"
p hash.id
#=> 123
hash["new_field"] = "stuff"
p hash.new_field
#=> stuff