こんにちは。みかみにございます。


 るびきちさん、ご教示ありがとうございます。

| > TMail::Mail クラスにインスタンス変数を一つ追加したい
| > のですが、値を代入しても nil になってしまいます。
| こういう場合、TMail::Mailクラスをインスタンスに持つクラスを
| つくってみるのはどうでしょうか?

 難しくて、理解できていないかもしれませんが、これは、

class A
  def initialize(int)
    @num = int
    ...
  end
  def num
    @num
  end
end

a = A.new(1)
p a.type #=> TMail::Mail
p a.num  #=> 1

 というクラス A を作るということでしょうか?
そうだとしても、その方法が分かりません。お手数をお掛けして
済みませんが、重ねてご教示のほどお願い致します。


| > class Hoge
| >
| >   class Fuga < TMail::Mail
| >
| >     def self.load(str, int)
| >       @num = int
| >       super(str)
| >     end
| これではクラスHoge::Fugaのインスタンス変数@numが設定されます。
| Hoge::Fugaのインスタンスではありません。
| なぜならHoge::Fugaの特異メソッド(クラスメソッド)なので。

 これも難しいのですが、

 インスタンス変数: 所属 = オブジェクト, スコープ = メソッド
      (『Ruby プログラミング入門』 p.172)

 で、上記の @num は、
    所属 =     Hoge::Fuga クラス (クラスもオブジェクトだから)
    スコープ = self.load  メソッド

 なのだという理解であっていますでしょうか?
こちらは、あまりきれいなソースではありませんが、
下記のようにとりあえず望み通りの結果が得られました。

 ありがとうございます。


(ソース)
#!/usr/bin/ruby

require 'tmail'

class Hoge

  class Fuga < TMail::Mail

    def self.load(str, int)
      new(TMail::FilePort.new(str), TMail::DEFAULT_CONFIG, int)
    end

    def initialize(port = nil, conf = TMail::DEFAULT_CONFIG, int = nil)
      @num = int
      super(port, conf)
    end

    def num
      @num
    end
  end

  def initialize(str, int)
    @mail = Fuga.load(str, int)
    p @mail.num
    p @mail.from.join(', ')
  end
end

int = 130
Hoge.new("#{ENV['HOME']}/Mail/inbox/#{int.to_s}", int)

(実行結果)
% ./test.rb
130
"kofu / nmn.jp"

    ______________________________________________________
   /                                               ______/
  /  みかみ まさと - 英語表記も姓名順です        _____/
 /   Mikami Masato - ↓最終更新日  11/11       ____/
/       興  風  館 - http://kofukan.nmn.jp/  ___/