rubyメタプログラミング類の真実

807 ワード

次のコードを見てください.
class D
 def my_methond
   @v = 'demo'
 end
end

d = D.new
puts d.class
puts d.instance_variables #puts nothing

d.my_methond
puts d.instance_variables #puts @v

対象の中に何があるか考えてみましょう.
my_を呼び出していますmethondの前に、インスタンスには何もありません.my_を呼び出しています.methondの後、インスタンスにはインスタンス変数があります.
したがってrubyでは、オブジェクトのクラスとそのインスタンス変数は何の関係もなく、インスタンス変数に値を割り当てると生成されます.したがって、同じクラスでは、異なるインスタンス変数を持つオブジェクトを作成できます.rubyのインスタンス変数をハッシュテーブルのキー値として理解できます.各オブジェクトのキー値が異なる場合があります.
私たちは対象にはまだ方法があると思っていますが、実際には対象には方法がありません.オブジェクトの内部には、割り当てられたインスタンス変数と独自のクラスへの参照のみが含まれます.インスタンスメソッドが本当に存在する場所はクラスにあります.これは、同じクラスのオブジェクトが同じインスタンス変数を共有せずに同じメソッドを共有する理由です.
 
まとめ:オブジェクトのインスタンス変数はオブジェクト自体に存在し、オブジェクトのメソッドはオブジェクト自体のクラスに存在します.