From: "\"みかみまさと\" " Date: 2002-11-24T17:12:31+09:00 Subject: [ruby-list:36578] Re: インスタンス変数が nil になってしまう こんにちは。みかみにございます。  るびきちさん、ご教示ありがとうございます。 | > 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/ ___/