Oliverです。
いま書いてるソフトをプラグイン構造にしようと思ってるんですが、その際に
ブチ当たった疑問がひとつ。
動作中にこれまでインスタンスされたオブジェクトも含め、あるクラスにインス
タンス変数を追加する最善の方法は?
具体的にいうと、ネットワーク上のホストに相当するHostクラスがあって、追加
ロードされたプラグインは各自このクラスに特異メソッドを追加して、それぞれが
必要なデータを記録していく、という風に考えてます。
コードにするとこんな感じ
=== Host.rb ====
class Host
def initialize( ip )
@ip = ip
end
attr_reader :ip
end
=================
で、インスタンス変数およびアクセスメソッドの追加方法ですが、
==== HogePlugin.rb ====
class Host
attr :@mac
attr :@os
end
class HogePlugin
...
end
=======================
では、 @mac, @os が(当然ながら)初期化されてない、と怒られてしまいます。
このプラグインがロードされた後にインスタンスされるオブジェクト用には
コンストラクタをオーバライドして、そこで初期化した後に、古いのを呼び出せば
いいんですが、そでに存在するオブジェクトで、最初にインスタンス変数が
アクセスされた時に初期化されるよう、
class Host
def mac
@mac = nil if !defined? @mac
@mac
end
attr_writer :mac
def os
@os = "" if !defined? @os
@os
end
attr_writer :os
end
なんて対処してますが、じつはもっと「正しい」方法があるよう
な気がして.... (笑) どうでしょう?
attr( name[,assignable][, initializing_expr] ) とかあると便利かなとも
思ったり。
--
Oliver M. Bolzer
oliver / gol.com
GPG (PGP) Fingerprint = 621B 52F6 2AC1 36DB 8761 018F 8786 87AD EF50 D1FF