4

例如 - 如果我有一个应用程序并且我想创建一个将通过插件导入的对象,我将如何编写它?

我已经整理了一个例子 - 它按我的意图工作;但是我不确定这是否是“传统”的方式。

在 Ruby 中是否有更有效或更正确的方法来执行此操作?

开始.rb

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')

云.rb

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
4

1 回答 1

1

Jekyll是一个广泛使用的提供插件的 Ruby 项目。我非常喜欢他们的方法:

  1. 实现一个实现插件基本功能的基类(Jekyll 有几种不同类型的类可以继承)。

  2. 清楚地指定子类必须覆盖哪些方法才能使插件工作。

然后,您可以让您的用户将所有插件转储到一个plugins目录中,并像现在一样加载所有文件。这种方法建立在坚实的 OO 概念之上,而且非常简洁。

一个建议:Ruby 提供了一个可以使用的继承回调。这比使用 搜索所有类要好得多asdf < self

于 2013-08-02T05:55:22.147 回答