8

したがって、Ruby では を呼び出すことですべてのインスタンス変数を取得できることはわかっていますが#instance_variables、まだ設定されていない場合は表示されません。

class Walrus
  attr_accessor :flippers, :tusks
end

w = Walrus.new
w.instance_variables # => []
w.tusks              # => nil
w.instance_variables # => [:@tusks]

attr_accessor で定義されたすべてのインスタンス変数にすぐにアクセスしたい。

w = Walrus.new
w.instance_variables # => [:@tusks, :@flippers]
4

3 に答える 3

15

まあ、それらはまだ存在しません。インスタンス変数は、最初の代入時に存在します。まったく新しいインスタンスでそれらが必要な場合は、コンストラクターでそれらに触れます。

class Walrus
  attr_accessor :flippers, :tusks

  def initialize
    self.flippers = self.tusks = nil
  end
end

w = Walrus.new
w.instance_variables # => [:@tusks, :@flippers]
于 2012-05-18T14:04:34.523 に答える
5

さて、attr_accessorメソッドのペア、セッターとゲッターを作成します。リストを取得するための組み込みの方法があるかどうかはわかりませんが、結果のペアのインスタンスメソッドを調べることができます。

Walrus.instance_methods.find_all do |method|
  method != :== &&
  method != :! &&
  Walrus.instance_methods.include?(:"#{method}=")
end
于 2012-05-18T14:16:18.257 に答える
0

オブジェクトまたはクラスからメソッドを差し引いたメソッドを使用するのはどうですか? 返される配列には、定義された属性/メソッドと、ゲッター/アクセサーで定義されたインスタンス変数が含まれます。

your_instance_name.methods - Object.methods
your_instance_name.methods - Class.methods
于 2015-02-15T05:23:34.523 に答える