查克的回答比我上次的兩次嘗試要好。本徵類不像我曾想過的那樣是self.class
;它花了比我寫的更好的測試來實現這一點。
用我的舊代碼,我在下面的方式進行測試,發現該班確實操縱,而不是實例:
a = MyClass.new :my_attr => 3
b = MyClass.new :my_other_attr => 4
puts "Common methods between a & b:"
c = (a.public_methods | b.public_methods).select { |v| a.respond_to?(v) && b.respond_to?(v) && !Object.respond_to?(v) }
c.each { |v| puts " #{v}" }
產量爲:
Common methods between a & b:
my_other_attr=
my_attr
my_attr=
my_other_attr
這清楚地反駁我前提。我的道歉Chuck,你一直都是。
年長的答案:
attr_accessor
只在類定義計算時,一個實例的未初始化工作。因此,直接做你想做的唯一方法是使用instance_eval
一個字符串:
class MyClass
def initialize(params)
#hash = {"key1" => "value1","key2" => "value2","key3" => "value3"}
params.each do |k,v|
instance_variable_set("@#{k}", v)
instance_eval %{
def #{k}
instance_variable_get("@#{k}")
end
def #{k}= (new_val)
instance_variable_set("@#{k}", new_val)
end
}
end
end
end
爲了測試這種嘗試:
c = MyClass.new :my_var => 1
puts c.my_var
查克,你忘了@字母的前綴... – 2009-10-23 18:36:11
現在我沒有。 – Chuck 2009-10-23 18:45:45