ハッシュを反復処理するインスタンス変数を宣言する!
-
06-07-2019 - |
質問
i次のことをしたい:
辞書を反復処理するクラスのインスタンス変数を宣言したい。
このハッシュを持っていると仮定しましょう
hash = {"key1" => "value1","key2" => "value2","key3" => "value3"}
そして私はクラスのインスタンス変数として各キーを持ちたいです。そのハッシュを反復処理する変数を宣言できるかどうかを知りたいです。このようなもの:
class MyClass
def initialize()
hash = {"key1" => "value1","key2" => "value2","key3" => "value3"}
hash.each do |k,v|
@k = v
end
end
end
これが機能しないことはわかっています!このコードは、自分が望むものをより明確に理解できるかどうかを確認するためにのみ使用しています。
ありがとう!
解決
class MyClass
def initialize()
hash = {"key1" => "value1","key2" => "value2","key3" => "value3"}
hash.each do |k,v|
instance_variable_set("@#{k}",v)
# if you want accessors:
eigenclass = class<<self; self; end
eigenclass.class_eval do
attr_accessor k
end
end
end
end
固有クラスは単一のオブジェクトにのみ属する特別なクラスであるため、そこで定義されたメソッドはそのオブジェクトのインスタンスメソッドになりますが、オブジェクトの通常クラスの他のインスタンスには属しません。
他のヒント
class MyClass
def initialize
# define a hash and then
hash.each do |k,v|
# attr_accessor k # optional
instance_variable_set(:"@#{k}", v)
end
end
end
チャックの答えは、私の最後の2回の試行よりも優れています。 eigenclassは、私が思っていた 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
http://facets.rubyforge.org/apidoc/api /more/classes/OpenStructable.html
OpensStructableはmixinモジュールです OpenStructの動作を提供できます 任意のクラスまたはオブジェクトに。 OpenStructable データオブジェクトの拡張を許可します 任意の属性。