クラスで宣言されたすべてのインスタンス変数を取得するのを手伝ってください。同じ方法instance_methods
で、クラスで使用可能なすべてのメソッドが表示されます。
class A
attr_accessor :ab, :ac
end
puts A.instance_methods #gives ab and ac
puts A.something #gives me @ab @ac...
クラスで宣言されたすべてのインスタンス変数を取得するのを手伝ってください。同じ方法instance_methods
で、クラスで使用可能なすべてのメソッドが表示されます。
class A
attr_accessor :ab, :ac
end
puts A.instance_methods #gives ab and ac
puts A.something #gives me @ab @ac...
あなたが使用することができますinstance_variables
:
A.instance_variables
しかし、それはおそらくあなたが望むものではありません。なぜなら、それはそのクラスのインスタンスではなく、クラス A
のインスタンス変数を取得するからです。だからあなたはおそらく欲しい:
a = A.new
a.instance_variables
ただし、呼び出すだけでattr_accessor
はインスタンス変数は定義されない(メソッドを定義するだけである)ため、明示的に設定するまでインスタンスには何も存在しないことに注意してください。
a = A.new
a.instance_variables #=> []
a.ab = 'foo'
a.instance_variables #=> [:@ab]
すべてのインスタンス変数の値を取得したい場合は、次のように試すことができます。
class A
attr_accessor :foo, :bar
def context
self.instance_variables.map do |attribute|
{ attribute => self.instance_variable_get(attribute) }
end
end
end
a = A.new
a.foo = "foo"
a.bar = 42
a.context #=> [{ :@foo => "foo" }, { :@bar => 42 }]
これは絶対確実ではありません-パターンに一致する追加のメソッドをクラスで定義できます-しかし、私のニーズに合っていることがわかった1つの方法は次のとおりです。
A.instance_methods.grep(/[a-z_]+=/).map{ |m| m.to_s.gsub(/^(.+)=$/, '@\1') }
属性の方法ですべてのインスタンス変数のハッシュを取得したい場合は、Aschenの回答に続いて行うことができます
class A
attr_accessor :foo, :bar
def attributes
self.instance_variables.map do |attribute|
key = attribute.to_s.gsub('@','')
[key, self.instance_variable_get(attribute)]
end.to_h
end
end
a = A.new
a.foo = "foo"
a.bar = 42
a.context #=> {'foo' => 'foo', 'bar' => 42}
@Obromiosからの回答に基づいて、エンドユーザーへの表示に適した属性の快適で柔軟なダンプを可能にするクラスに.to_h
とを追加しました。.to_s
この特定のクラス(ActiveRecordモデルではない)には、さまざまな状況で設定されたさまざまな属性があります。印刷時に値を持つ属性のみが表示されますmyvar.to_s
。これが私の望みでした。
class LocalError
attr_accessor :product_code, :event_description, :error_code, :error_column, :error_row
def to_h
instance_variables.map do |attribute|
key = attribute.to_s.gsub('@', '')
[key, self.instance_variable_get(attribute)]
end.to_h
end
def to_s
to_h.to_s
end
end
これにより、この単純なコードをメーラーテンプレートに入れることができます。
Data error: <%= @data_error %>
そしてそれは(例えば)を生成します:
Data error: {"event_description"=>"invalid date", "error_row"=>13}
LocalError属性が将来変更されるときにメーラーを更新する必要がないため、これは便利です。