From: matz@... (Yukihiro Matsumoto) Date: 1998-11-20T11:28:19+09:00 Subject: [ruby-list:10982] Re: gets のクラス まつもと ゆきひろです In message "[ruby-list:10973] gets のクラス" on 98/11/20, Yoshiki WADA writes: |和田といいます。 | |次のようなメソッドを持つクラスを作ろうと思っています。 うーむ,IOのサブクラスというわけではなくてgets/ungetsだけを 持つクラスを作りたいんですかね. でしたら,以下のようなコードはどうでしょう. class NewIO def NewIO.open(*args) new(open(*args)) end def initialize(io) @io = io @lastline = nil end def gets(*args) if @lastline line = @lastline @lastline = nil return line end @io.gets(*args) end def ungets(line) @lastline = line end end 使い方はこんな感じです io = NewIO.open(path, mode) line = io.gets io.ungets(line) ただし,今書き殴っただけで実行さえしてませんからミスはあるか も.概念だけ吸収して下さい. もし,IOクラスの全機能を提供し,かつungetsも提供したいという ことでしたら,delegate.rbが使えるかも知れません.が,それは それでややこしいので,別の機会に説明しましょう. あと,いずれにしてもIOクラスを直接継承しようと思わない方が良 いです.IOクラスは組込みクラスなので,インスタンス変数が持て ませんから. |getsは組み込みで用意されているので、組み込みのgetsメソッドを持つクラスから |継承して新しいクラスを作ろうと思っているのですが、 |組み込みのgetsが属するクラスがわかりません。 |教えていただけないでしょうか。 関数的に使う方のgetsはKernelモジュールで定義されてます.でも これは継承しなくても使えますよん.継承は重要な概念ですが,そ んなにこだわらなくても良いと思います. # 継承は最後の武器だ……それじゃ忍者部隊月光か |あと、メソッドが属するクラスを調べる方法はあるでしょうか。 うーん,あるメソッドが定義されているクラス/モジュールを動的 に知る方法はやや複雑です. Object#type Module#ancestors Module#instance_methods を組み合わせれば可能ですね.もっとも http://www.netlab.co.jp/ruby/jp/man/mindex.html を見れば用は足りるかも知れませんね. まつもと ゆきひろ /:|)