1

CodeSchoolチュートリアルで次のコードに出くわしました:

class MethodLogger

 def log_method((klass,method_name)
  klass.class_eval do
   alias_method "#{method_name}_original" method_name
   define_method method_name do
    puts "#{Time.now}: Called #{method_name}"
    send "#{method_name}_original"
   end
  end
 end

end

このコードの「send」メソッドの受信者はどうすればわかりますか? ここで、チュートリアルでは、「klass」で表されるクラスが「send」メソッドのレシーバーになると述べています。このようなコードの場合:

class Klass
end
k = Klass.new
k.send :hello,  

k が send の受信者であり、 main が送信者であることは明らかです。しかし、最初のコード サンプルでは、​​どうすれば受信者を推測できますか?

4

2 に答える 2

2

受信者はの現在の値ですself

したがって、次のことができます。

class MethodLogger
 def log_method((klass,method_name)
  klass.class_eval do
   alias_method "#{method_name}_original" method_name
   define_method method_name do
    puts "#{Time.now}: Called #{method_name} on #{self.class}"
    send "#{method_name}_original"
   end
  end
 end
end

しばらくすると、頭の中で追跡することを学びselfます:)

于 2013-05-29T09:07:46.110 に答える
1

この場合、 send は で呼び出されself、これは のインスタンスになりますklass。デフォルトでは、メソッドのレシーバーが指定されていない場合は になり、そのような名前selfのメソッドが存在しない場合は、モジュールがレシーバーになります。したがって、この場合、問題の行は次のようになります。selfKernel

self.send "#{method_name}_original"
于 2013-05-29T09:10:15.040 に答える