Rubyでプラグイン機能を実現する

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Rubyでプラグイン機能を実現するための自分なりの方法。

概要

入力があって、それをいじっていくタイプのプラグイン機構を作りたい。例えば、rubyという入力があって、大文字にするプラグインと、2回繰り返すプラグインがあったら、RUBYRUBYとなる。

ディレクトリ構造

+--main.rb
+--plugins
|  +--pluginA
|  |  +--plugin.rb
|  +--pluginB
|  |  +--plugin.rb

プラグインを追加したい場合

例えば、大文字にするプラグイン(upcase)を追加したい場合

plugins/upcase/plugin.rb
class UpcasePlugin
  def on_message(msg)
    msg.upcase!
  end
end

ソース

main.rb
plugins = []
Dir.entries('plugins').each do |name|
    path = "plugins/#{name}"
    next if File.ftype(path) != 'directory' or %w(. ..).include? name

    require_relative path + '/plugin.rb'
    name[0] = name[0].upcase
    plugins << Module.const_get("#{name}Plugin").new
end

loop do
    msg = gets.chomp!
    plugins.each{|plugin| plugin.on_message(msg) }
    puts msg
end

エラー処理皆無ですw。plugins内にあるディレクトリをプラグインとみなし、その中にあるplugin.rbをrequireすることでファイルをロードし、Module.const_getでクラスを取得してnewしています。プラグインを使うときは、eachでぐるぐる回します。