From: matz@... (Yukihiro Matsumoto) Date: 1997-07-15T23:25:02+09:00 Subject: [ruby-list:3351] Re: module context and dynamic class define [Re: meta programings] まつもと ゆきひろです In message "[ruby-list:3348] Re: module context and dynamic class define [Re: meta programings]" on 97/07/15, 石塚圭樹 writes: |けいじゅ@今はフリー(^^;;;です. |>そう考えた方がよいです.が,いつでも信頼できるパスが生成でき |>るわけではないんですね.たとえば,今回のようなクラスを生成す |>るAPIを用意してしまえば,かならずしもパスでアクセスできない |>クラスをつくってしまうことが出来るわけです. | |これはそのようなAPIを作った場合ですよね? 今のところは, このパスが識別 |子となっているわけですよね? | |この考えはこのまま維持した方が良いのでは? と思うのですがどうなんでしょ |う? うーん,たしかに.C APIでは * トップレベルにクラス/モジュールを定義するAPI * あるクラス/モジュールの内部にクラス/モジュールを定義するAPI しか提供されていませんからね.これでパスが維持されているわけ ですから,ruby meta APIでも踏襲されるべきでしょうね.クラス/ モジュールには必ずパスが設定されるAPIにしましょう. |>この場合,module/classは積極的に既に存在するクラスやモジュー |>ルを拡張する機能を持つことになりますね.今はクラスの機能拡張 |>は「おまけ」的な扱いなんですが. | |うーん. なるほど確かにそうでしたね. 積極的に宣伝していませんね(^^;;; しかも -w オプションでは警告が出ますし. |既存クラスの機能拡張は, あまり望ましくないんですかねえ?? 微妙ですよね.クラスをどういうものと捉えるかにもよると思うの ですが,少なくとも初期のrubyはクラスやモジュールを比較的静的 なものと考えていたために,それを反映して機能追加に警告を出す ことにしていたのだと思います. |それではこれ |はどうでしょう? | |foo = Module.new("Baz", nil, Foo::Bar) { | ... |} | |つまり, 先ほどの動的クラス生成のメソッドで, そのクラスがすでに存在して |いる場合は新たにクラスを生成せずにそのクラスをそのまま返し, さらにその |クラスのコンテキストでイテレータを評価する. | |というのは? これだと動的クラス生成機能のおまけとして, 動的クラス機能追 |加ができるようになります. これだと, (静的)クラス定義と対象性があってい |いかも知れない? そうかもしれないんですが,実際に作って試したところ,イテレー タでクラス定義本体を表現するのは * イテレータのバインディングは変えられない * メソッド内でメソッドが定義できない * 定数のスコープがごっちゃになる * デフォルトのprivate/publicのスコープにあわない など,問題が多発したので,あんまり採用したくないんです. まつもと ゆきひろ /:|)