我正在开发一个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)
如何在不知道它被称为什么的情况下实例化该类?
听起来你正在建立一个编写软件扩展的系统.由于扩展类可能在某种程度上是相似的,例如共享一些常用方法,因此有一个基类调用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因为我没有看到立即实例化该类的理由,但这取决于你.我只会存储一个类列表.