例如-如果我有一个应用程序,我想创建一个将通过插件导入的对象,我将如何着手编写?
我举了一个例子——它按我的意图工作;但是我不确定这是否是“常规”的方法。
在ruby中有没有一种更有效或更合适的方法来实现这一点?
苏格兰皇家银行
require './cloud.rb'
dir = 'plugins'
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
mycloud = CloudProvider.descendants.first.new
mycloud.say('testing')
云彩
class CloudProvider
def self.descendants
ObjectSpace.each_object(Class).select { |asdf| asdf < self }
end
end
插件/aws.rb
# This one inside plugins/
class AWS < CloudProvider
def initialize
end
def say(val)
puts val
end
end
最佳答案
Jekyll是一个广泛使用的ruby项目,它提供了plugins。我非常喜欢他们的方法:
实现实现插件基本功能的基类(jekyll有几种不同类型的类可以继承)。
明确指定子类必须重写哪些方法才能使插件工作。
然后您可以让用户将所有插件转储到plugins
目录中,并像现在这样加载所有文件。这种方法建立在坚实的面向对象概念之上,而且非常干净。
一个建议:ruby提供了一个inherited回调,您可以使用它。这比使用asdf < self
搜索所有类要好得多。