7

彼が「 A Block Costumecloakerで書いた_why の方法を理解しようとしています。

class HTML
  def cloaker &blk
    (class << self; self; end).class_eval do
      # ... rest of method
    end
  end
end

私はそれclass << self; self; endが の Eigenclass を開くことを理解していますがself、これまでインスタンスメソッド内でこれを行う人を見たことがありません。selfこれを行うポイントは何ですか?selfメソッドが呼び出された受信者である必要があるという印象を受けましたcloakerが、内部から呼び出されますmethod_missing:

def method_missing tag, text = nil, &blk
  # ...
  if blk
    cloaker(&blk).bind(self).call
  end
  # ...
end

では、通話selfの中身は何ですか? method_missingそして、私たちが呼び出すときは何selfですか:

((class << self; self; end).class_eval)

メソッド内cloaker

基本的に、HTML クラスの Eignenclass を開いているのか、それとも HTML クラスの特定のインスタンスに対して開いているのかを知りたいです。

4

1 に答える 1

1

cloakerオブジェクトでそれを呼び出すため、メソッド内selfでは HTML のインスタンスになるため、HTML クラス インスタンスでシングルトン メソッドを効果的に作成しています。例えば:

class HTML
  def cloaker &blk
    (class << self; self; end).class_eval do
      def new_method
      end
    end
  end
end

obj = HTML.new
obj.cloaker
p HTML.methods.grep /new_method/  # []
p obj.singleton_methods # [:new_method]

編集

または、Jörg W Mittag がコメントしたように、1.9 より前の呼び出し方法"Object#define_singleton_method"

于 2013-05-08T14:07:28.047 に答える