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

我如何知道这段代码中“发送”方法的接收者是什么?这里,教程说“klass”代表的类是“send”方法的接收者。如果是这样的代码:

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

很明显 k 是 send 的接收者,而 main 是 sender 。但是在第一个代码示例中,我怎样才能推断出接收者?

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,如果没有这样self命名的方法,则Kernel模块将是接收者。所以在这种情况下,有问题的行将等同于:

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