例如-如果我有一个应用程序,我想创建一个将通过插件导入的对象,我将如何着手编写?
我举了一个例子——它按我的意图工作;但是我不确定这是否是“常规”的方法。
在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搜索所有类要好得多。

10-08 04:50