2016-07-29 3 views

答えて

3

Rubyでは、インスタンス変数は宣言されていません。彼らは初めてアクセスしたときにのみ生きる。したがって、同じクラスの2つのオブジェクトは、任意の時点で、完全に異なるインスタンス変数セットを持つことができます。

クラスの継承は、クラス定義に関連付けられていないため、インスタンス変数の場合は完全に無関係です。リモートで関連する唯一のことは、メソッドの実行中にインスタンス変数が作成され、このメソッドがどのクラスに属しているのかを知ることですが、AFAIKを達成することはできませんが、そうする利点はありません。

+0

結局のところ、それらは「インスタンス変数」と呼ばれます。 +1 –

1

私は(多分それは検索するにはより多くの時間を必要とする)明確な解決策が見つかりませんでしたが、私は次のコードをお勧めしたい:

class A 
    attr_accessor :a, :c 
    def initialize(a) 
    @a = a 
    @c = 1 
    end 
end 

class B < A 
    attr_accessor :b, :d 
    def initialize(b, a) 
    @b = b 
    @d = 1 
    super(a) 
    end 
end 

def test 
    t = B.new(1, 2) 
    getters = t.instance_variables.map{ |i| i.to_s.gsub('@', '') } 
    parents = B.ancestors.drop(1) 

    parents.each do |i| 
    curr = i.instance_methods.map(&:to_s) 
    getters.each do |gt| 
     if curr.include?(gt) 
     getters.delete(gt) 
     end 
    end 
    end 

    getters 
end 

test() # => ['b', 'd'] 

更新を:私は適切に接地Rubyist」に興味深いノートを見つけました':

Rubyではクラスが重要です。これらは、類似の動作を持つ複数のオブジェクトを簡単に作成するために、 ビヘイビアー(Personクラス、Taskクラスなどがあります)と のビヘイビアをバンドルしてラベル付けする方法です。しかし、 では、Rubyは他のオブジェクト指向の 言語とは異なります。実際の動作は個々のオブジェクトと同じです。すべてのオブジェクト は、そのクラスが実行しなかった動作(メソッド)を「学習」する可能性があります それ。

MladenJablanovićがあなたの質問に答えます。

関連する問題