instance_variables
メソッドを使用すると、継承チェーンから継承したインスタンス変数を含むオブジェクト内のすべてのインスタンス変数のリストが返されます。Ruby:基底から継承されていないオブジェクトのインスタンス変数をリストする
インスタンスはそのクラスでのみ定義できますが、ベースでは定義できませんか?
instance_variables
メソッドを使用すると、継承チェーンから継承したインスタンス変数を含むオブジェクト内のすべてのインスタンス変数のリストが返されます。Ruby:基底から継承されていないオブジェクトのインスタンス変数をリストする
インスタンスはそのクラスでのみ定義できますが、ベースでは定義できませんか?
Rubyでは、インスタンス変数は宣言されていません。彼らは初めてアクセスしたときにのみ生きる。したがって、同じクラスの2つのオブジェクトは、任意の時点で、完全に異なるインスタンス変数セットを持つことができます。
クラスの継承は、クラス定義に関連付けられていないため、インスタンス変数の場合は完全に無関係です。リモートで関連する唯一のことは、メソッドの実行中にインスタンス変数が作成され、このメソッドがどのクラスに属しているのかを知ることですが、AFAIKを達成することはできませんが、そうする利点はありません。
私は(多分それは検索するにはより多くの時間を必要とする)明確な解決策が見つかりませんでしたが、私は次のコードをお勧めしたい:
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ćがあなたの質問に答えます。
結局のところ、それらは「インスタンス変数」と呼ばれます。 +1 –