Cela ressemble à un bug/une limitation de OpenStruct sous 1.8.7 où il n'y a pas d'objet BlankSlate, causé par une implémentation qui utilise method_missing
pour décider si c'est une propriété spéciale ou non.
Voici une classe personnalisée similaire à OpenStruct qui fait ce que vous demandez sous 1.8.7; N'hésitez pas à développer et à rendre plus riche en fonctionnalités.
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
Je ne reçois pas cet avertissement même avec 'ruby -w' sous 1.9.2; Quelle est la saveur et la version de Ruby? – Phrogz
@Phrogz 1.8.7, ajouté la version infor à la question, merci pour votre rappel. – ywenbo