Ruby:如何要求并实例化目录中的所有文件?

And*_*rew 1 ruby

我正在开发一个Gem,它允许用户自动要求,实例化和注册特定目录中的类.我只是不确定如何实现这一目标.这就是我到目前为止所提出的......

Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
  require file
  extension_class = # instantiate the class here
  MyApp.extensions << extension_class
end
Run Code Online (Sandbox Code Playgroud)

如何在不知道它被称为什么的情况下实例化该类?

Dav*_*son 6

听起来你正在建立一个编写软件扩展的系统.由于扩展类可能在某种程度上是相似的,例如共享一些常用方法,因此有一个基类调用Extension所有扩展类都可以继承.

实际上,这对于所述问题非常有用,因为当用户从您的类继承时,您可以检测它,并将子类添加到列表中.以下是概念代码的一些证明:

class Extension
  class << self
    attr_reader :list
  end
  @list = []

  def self.inherited(klass)
    @list << klass.new
  end
end

# The MyExt class would be in another file, loaded by require.
class MyExt < Extension
end

p Extension.list   # => [#<MyExt:0xb777d884>]
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因不想使用子类,那么同样很容易Extension成为一个模块并使用included钩子而不是inherited.

就个人而言,我只是删除了调用,.new因为我没有看到立即实例化该类的理由,但这取决于你.我只会存储一个类列表.