看起來像1.8.7下的OpenStruct的bug /限制,其中沒有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
即使使用1.9.2下的`ruby -w`,我也沒有得到這個警告;你在運行什麼風味和版本的Ruby? – Phrogz 2011-02-06 05:42:43
@Phrogz 1.8.7,爲該問題添加了版本信息,謝謝您的提醒。 – ywenbo 2011-02-06 05:48:16