2012-05-18 8 views
7

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

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] 
+0

可能複製([ATTRの\の_readerによって定義されたかのattr \ _accessorれた属性を取得する方法]をhttp://stackoverflow.com/questions/10006889/how-to-get-attributes-that-were -defined-through-attr-reader-or-attr-accessor) –

答えて

15

まあ、それらはまだ存在しません。インスタンス変数は最初の割り当て時に存在します。彼らを新しいインスタンスにしたい場合は、コンストラクタでそれらをタッチします。

class Walrus 
    attr_accessor :flippers, :tusks 

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

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

よく、attr_accessorは、セッターとゲッターというメソッドのペアを作成します。私は、リストを取得する組み込みの方法があるかどうかわからないんだけど、あなたは結果のペアのためのインスタンスメソッドに目を通すことができます:

Walrus.instance_methods.find_all do |method| 
    method != :== && 
    method != :! && 
    Walrus.instance_methods.include?(:"#{method}=") 
end 
0

どのような方法マイナスオブジェクトまたはクラスのメソッドを使用してはどうですか?返される配列には、定義された属性/メソッドと、getter/accessorで定義されたインスタンス変数が含まれます。

your_instance_name.methods - Object.methods 
your_instance_name.methods - Class.methods 
関連する問題