54

クラスで宣言されたすべてのインスタンス変数を取得するのを手伝ってください。同じ方法instance_methodsで、クラスで使用可能なすべてのメソッドが表示されます。

class A
  attr_accessor :ab, :ac
end

puts A.instance_methods  #gives ab and ac

puts A.something         #gives me @ab @ac...
4

5 に答える 5

82

あなたが使用することができます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]
于 2012-08-12T21:09:22.937 に答える
15

すべてのインスタンス変数の値を取得したい場合は、次のように試すことができます。

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 }]
于 2016-05-31T10:35:27.850 に答える
1

これは絶対確実ではありません-パターンに一致する追加のメソッドをクラスで定義できます-しかし、私のニーズに合っていることがわかった1つの方法は次のとおりです。

A.instance_methods.grep(/[a-z_]+=/).map{ |m| m.to_s.gsub(/^(.+)=$/, '@\1') }
于 2018-09-06T22:28:20.437 に答える
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}
于 2018-11-26T20:56:44.003 に答える
0

@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属性が将来変更されるときにメーラーを更新する必要がないため、これは便利です。

于 2020-10-09T15:36:51.113 に答える