2004-09-05 ========== Ruby プラグインっぽいもん ------------------------- Reference URI: http://lowreal.net/logs/2004/09/05/4 Written Time: 2004-09-05T14:26:07+09:00 Tags: prog 別ファイルに定義されたクラスを動的に読み直したいのだけど、どうやっていいやら。単に eval とかやると同じクラス名はもう使ってるぜ?って警告されるわけだし、Class::new do ... end は違うくさいし、remove_const はメソッド内から呼べない*1 し。 プラグインみたいな。ずっと動きっぱなしのプログラムで、ある一部分だけソースからもう 一度読み直してやりたい。 # ML の過去ログで面白いのハケン [[ruby-list:27327] Haiku](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/27327). こういうの好き class PluginManager def initialize @plugins = {} end def class_na me(filename) File::basename(filename, ".rb").capitalize end def load (filename) class_name = class_name(filename) eval(open(filename) {| f| f.read }, binding) # インスタンス作成して @plugin に突っ込む。 e val("@plugins[class_name] = #{class_name}::new") end def unload(filename) class_name = class_name(filename) PluginManager.class_eval("remove_c onst(:#{class_name})") @plugins.delete(class_name) end def each @plugins.each do |k,v| yield k, v end endendpm = PluginMa nager::newpm.load("foo.rb")f = PluginManager::Foo::newpm.unload("foo.rb")f = Plug inManager::Foo::new # => uninitialized constant PluginManager::Foo (NameError)=be gin# foo.rbclass Fooend=endみたいな感じかなぁ……もっとスマートにできるような気がする。しかもコレだと Plugin Manager の外からロードしたクラスにアクセスできる(丁度上の f のように )んだよね。もう一個 Plugin クラスとか作ってその中にロードしたクラスのイ ンスタンス突っ込んでやろうか。