Chuck 的回答比我最近两次尝试的要好。eigenclassself.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
这显然反驳了我的假设。我很抱歉查克,你一直都是对的。
较旧的答案:
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