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