在加载时(不是在初始化时)在类中的包含模块中执行代码

bdx*_*bdx 3 ruby

我正在做一个项目,其中多个类将包括MyModule. 在包含模块后,我希望包含模块的类将类类型的句柄推送到特定的类级数组。

我在下面尝试过的伪代码没有达到我想要的效果:

class Poly
  @@tracking = []
end

module MyModule
  def initialize(klass)
    Poly.tracking << self # Where `self` is the class, e.g. `MyClass1`, not an instance of the class.
  end
end

class MyClass1
  include MyModule
end

class MyClass2
  include MyModule
end
Run Code Online (Sandbox Code Playgroud)

加载后,我希望Poly.tracking等于[MyClass1, MyClass2].

inf*_*sed 5

这是我将如何做到的。使用类实例变量而不是类变量。添加一个included方法,当模块包含在类中时,该方法作为回调运行:

class Poly
  def self.tracking
    @tracking ||= []
  end
end

module MyModule
  def self.included(base)
    Poly.tracking << base
  end
end

class MyClass1
  include MyModule
end

class MyClass2
  include MyModule
end

puts Poly.tracking.inspect #=> [MyClass1, MyClass2]
Run Code Online (Sandbox Code Playgroud)