就像我在标题中说的那样。我需要知道每次定义类时是否都有某种方法可以执行某些事情
就像放“ fifi”一样。
当我这样做时:
class Pipipupu
end
=> fifi
答案 0 :(得分:1)
class Object
def self.inherited(obj)
puts "fifi" if obj == Pipipupu
end
end
class Pipipupu
end
显示"fifi"
。
class Cat
end
不显示任何内容。参见Class#inherited,称为回调或 hook 方法。
如果您希望在创建任何类时显示"fifi"
,请替换
puts "fifi" if obj == Pipipupu
使用
puts "fifi" if obj.is_a? Class
答案 1 :(得分:0)
向inherited
添加一个BasicObject
钩子:
class BasicObject
def self.inherited(subclass)
puts "fifi"
end
end
为防止它弄乱其他钩子,而不是重新定义它,您可以在模块前面添加一个打印并调用super的模块,以调用已注册的行为:
module Hook
def inherited(subclass)
puts "fifi"
super
end
end
BasicObject.singleton_class.prepend(Hook)
然后:
irb> class Foo; end
fifi
=> nil
或者,将钩子添加到Object
。对于上面的Foo
,隐式超类是Object
。但是BasicObject
是Object
的超类。将钩子添加到BasicObject
还将打印指定BasicObject
为超类的类。