チャックの答えは、私の最後の 2 回の試みよりも優れています。固有値クラスは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
これは明らかに私の前提を反証しています。すみません、チャック、あなたはずっと正しかったです。
古い答え:
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