最近在学习 Ruby 中的钩子方法,有一个地方没有弄明白,自己也没有 google 到解决办法,麻烦高手赐教。 书中有这么一段话: 当为任意类或模块定义一个名为 method_added 的方法,它将在为该类或模块定义一个实例方法时被调用。 值得注意的是,method_added 类方法会被该类的子类所继承。但是这个钩子方法没有任何类信息的参数,所以在添加某个方法时,无法知道是定义 method_added 方法所在的类添加的,还是它的某个子类所添加的。解决该问题的一个方法是为定义 method_added 的类同时定义 inherited 钩子方法,然后这个 inherited 方法为每个子类定义一个 method_added 方法。 我是这么定义的,这种方法可以正确的输出其子类和子类定义的方法 Ruby 版本是 187
def String.inherited(klass)
klass.instance_eval do
def method_added(name)
puts "#{self} added a method #{name}"
end
end
end
class SubClass < String
def a_method; end
end
# => SubClass added a method a_method
但是我按如下的方法定义后,就没有任何输出,实在是没弄明白哪里错了,麻烦大家指点下,谢谢。
def String.inherited(klass)
klass.instance_eval do
define_method :method_added do |name|
puts "#{klass} added a method #{name}"
end
end
end
class SubClass < String
def a_method; end
end