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

时间:2015-05-13 03:22:13

标签: ruby

我正在开展多个课程将包含MyModule的项目。在包含模块之后,我希望包含该模块的类将类类型的句柄推送到特定的类级数组。

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

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

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

1 个答案:

答案 0 :(得分:4)

这是我怎么做的。使用class instance variable而不是类变量。添加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]