From: matz@... (Yukihiro Matsumoto) Date: 1998-03-09T15:39:10+09:00 Subject: [ruby-dev:1616] Re: [BUG] String.dup まつもと ゆきひろです In message "[ruby-dev:1609] Re: [BUG] String.dup" on 98/03/08, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. |私はsuperが本質的な問題になっていると気づくまでだいぶかかってしまいま |した. 構造の互換性をチェックする方法に目がいっていたもので(^^;;; まず最初に「私が1.1b9以降にこの問題に関して行ったこと」を書 いておきます.まずクラスにインスタンスが通常のオブジェクトで ないことを示す1bitのフラグを用意して,すべての組み込みオブジェ クトに関してこのフラグを明示的にセットしました. また,このフラグがセットされたクラスを継承したクラスはこのフ ラグの状態も継承するようにしました. 更にdata_object_allocの引数として使われたクラスにもこのフラ グをセットするようにしました. そして最後にobj_alloc(通常オブジェクトの割り当てルーチン)で このフラグが立っているクラスのインスタンスを通常オブジェクト として生成しようとするとTypeErrorを上げるようにしました. これらによって問題のほとんどが解消されます. 残る問題は 拡張モジュールで T_DATAなインスタンスを作るクラスを Objectのサブクラスとして定義して そのクラスのインスタンスが一つも定義される前に 例の方法(def new; super; end)を使って インスタンスを生成されちゃった場合ですが,これは * ここまでされると仕方がない * T_DATAなクラスはDataのサブクラスにするよう指導する の両面(?)で対応したいと思ってます. |>そのクラスからのみスーパークラスのメソッドがundefされているように |>見せるためには、クラスの中に各スーパークラスに対応したテーブルを |>すべて持たせる必要がありますよね。 | |テーブルというか, super_undefされたメソッドのハッシュ表が必要になりま |すね(案1) 構造体の空間に余裕がないので案1は避けたい(それにすごくムダ) |(案2) メソッドそのものの属性として super_undefされているかどうかの状態 | を持たせる. まあ,これは無意味ではないですよね.実装もそんなに大変ではな いです. |(案3) 仮想的なモジュールをinclude(クラスメソッドならextend)して, そこ | でメソッドをundefする. これも簡単ですよね.かなり無駄ですけど. |この方法は上記を見れば比較的簡単に実現できますが, すべてのPrimitiveク |ラスが仮想的なモジュールを持つことになるのがちょっとって気がしますね. ええ. |(案4) クラスのViewを導入する. super_undefはそのクラスから上位のクラス | がどのように見えるメソッドを変更する手段です. クラスのviewを導入 | して, 下位のクラスからはviewを通して見えるようにすれば良いかなと | 思います. えーと,viewって? ^^;;; |(案4)のviewは, 松本君が大学時代やっていた研究課題でしたよね? ですので, |rubyに導入するのも悪くないかなと(^^;;; ただ, だいぶ追加機能が発生しま |すが... 良く覚えてましたね.そんなこと.^^;;; 私の研究していたview(profileって名前でしたが)は静的型のある 言語におけるクラスの外部仕様のサブセットでしたから,ここでの viewとはちょっと,というかだいぶん違いますよね.Javaにおける インターフェースに近いイメージですか.もう10年くらいの話になっ ちゃいますが. |効果はないのですが, 元々の用途は上位クラスで定義されているメソッドを見 |えなくするための機能なので, undefをsuper_undefと再定義しても全然問題な |いと思うのですが? | |# メソッドを消去するのはModule#remove_methodでした. まずそもそもsuper_undefってナニ? って疑問があるんですが…. # 最初の例に出て来たのは super_redef だし で,本来の話題に帰ると,元々の問題は一応の解決を見ちゃったん で,今回提示されたfinalとsuper_undef/super_redefとviewがそれ ぞれruby的にどのような意味を持つのか,採用すべきなのか,とい う話に移りたいんですケド. まつもと ゆきひろ /:|)