我需要知道是否有一种方法可以在每次定义类时执行某些操作

时间:2019-04-21 01:45:44

标签: ruby

就像我在标题中说的那样。我需要知道每次定义类时是否都有某种方法可以执行某些事情

就像放“ fifi”一样。

当我这样做时:

class Pipipupu
end

=> fifi

2 个答案:

答案 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。但是BasicObjectObject的超类。将钩子添加到BasicObject还将打印指定BasicObject为超类的类。