From: matz@... (Yukihiro Matsumoto) Date: 1997-02-15T18:35:19+09:00 Subject: [ruby-list:2142] Re: [BUG] for line in $< まつもと ゆきひろです In message "[ruby-list:2139] Re: [BUG] for line in $<" on 97/02/15, 石塚圭樹 writes: |けいじゅ@SHLジャパンです. |[1] $<.type | |上のパッチで変わったのは, 第4パラメータだけですがこれってどういう意味 |なんでしょう? メソッドの引数の数です.間違って登録していました.-1は argc/argv形式で不定この引数をとるという意味です.詳細は README.EXTを参照してください. |print $<.type |---- |Object | |となりますが, これはどういう意味でしょうか? | |$<は, 特異メソッドが定義されたオブジェクトなのでしょうか? そうです.このようなものにはほかにmain(トップレベルのself)や ENVがあります. |[2] cloneの定義 |また, | |f = $<.clone | |とすると, $< と同じメソッドが使えるようになりますが, cloneは特異メソッ |ド(特異クラス)を継承していると考えて良いのでしょうか? 特異クラスを継承しているというのはむずかしい表現ですね. cloneは特異メソッドも含めて継承していると表現してください. rubyの実行モデルには「特異クラス」というものはありません.こ れは実装上の都合です. |[3] 特異クラスの継承 |あるオブジェクトの特異クラスを継承するメソッドはcloneしかないのでしょ |うか? 特異メソッドを含めてオブジェクトをコピーする手段はcloneしか ありません.ちなみにdupは「同じ内容のオブジェクトを作る」こ としか保証していません.実際はデフォルトの動作ではcloneして いますけど. |[4] cloneの再定義 |また, cloneも当然再定義できますが, cloneを再定義した場合も特異クラスの |継承関係を維持すべきなのでしょうか? 「特異メソッドを含めて複製する」ですね.その方が良いと思います. |cloneを適当に再定義すると, この継承関係は維持できるとは限りませんよね. |cloneの再定義したい場合, 例えばデフォルトの動作はシャロウコピーですが, |ディープコピーにしたいと思ったら, 以下のようにまずcloneをおこなって定 |義した方が良いのでしょうか? そうなるとおもいます. |[5] オブジェクトの比較 |特異クラス(すべての特異メソッド)が一致するかどうかの判断はできるのでしょ |うか? できないでしょうね.特異クラスそのものがrubyからはみえない概 念ですから,それを使って比較することはrubyの範囲内ではできま せん.もちろん,Cでメソッドを追加すれば可能ですけど,その場 合でも,cloneは特異クラスを共有するのではなく,特異クラスの コピーを作っていますから,単純な比較ではすまないでしょうね. # 特異メソッドに関してはSelf(言語)のモデルを想像してください. # 実装にとらわれて特異クラスのことを考えると混乱します. まつもと ゆきひろ /:|)