From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-07-14T20:17:50+09:00 Subject: [ruby-list:3344] module context and dynamic class define [Re: meta programings] けいじゅ@今はフリー(^^;;;です. In [ruby-list :03342 ] the message: "[ruby-list:3342] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] ", on Jul/14 17:38(JST) matz@netlab.co.jp (Yukihiro Matsumoto) writes: >|Foo::Bar.to_s --> Foo::Bar >| >|この辺りの表現はどうなるんですか? とくに, object.type は文字列を返すの >|で, 一意性が崩れてしまって使いづらくなると思いますが? > >いまんとこClass#newやModule#newを使った場合,クラスのパスは >定義されません.typeで使いにくいのは確かですね.でも,既に話 >が出たようにruby 1.1ではtypeなどはクラスオブジェクトそのもの >を返すようにしようと思うので,あまり問題はないかも. なるなる. そういえばそうですね. ># 実はパスが正しく定義されないとmarshalで問題が起きるんです ># けど. うーん. どういう点で? オブジェクトからクラスへの参照をこのパス表現で fileにセーブしているからですね? >|a = Foo::Bar::Baz >|a.constant_value("class-name") = Module.new("class-name") {...} >|と書けるのかな? それなら問題ないな. > >基本的にはこれでいきますね.ただしmarshalの問題は残りますが. こうやって考えると, クラスのパス表現はクラスの一意性のためになくてはな らないものと考えた方がいいんですかね? # marshalはファイル表現ですが, ネットワーク表現でも同じ問題が発生しま # すしね. 動的にクラスを生成する時に, 絶対パス表現または, 上位パスクラスも加える のはどうでしょう? foo = Module.new("class-name", super_class, upper_class) {...} これなら, パスの問題はなくなりますよね? あ. そうそう. この問題と class-contextの話しはリンクしているとおもいま す. a = Foo::Bar::Baz module a ... end が実現できれば, 動的にクラスが生成できる独自メソッドはそれほど必要性は ないかもしれません. このなかで evalすれば良いだけですから: a = Foo::Bar::Baz module a eval "class #{class_name} ... " end # evalを多用するとわけが分からなくなるので, 動的クラス生成メソッドはあっ # た方が嬉しいですが... >|>動的にコードを生成する? lispじゃないんだから. >|まあ. そういわないで, 実際やっているんだから(^^;;; > >文字列でなく,コードオブジェクトを直接生成するというのはruby >の範囲を越えるという印象が強いです.どうでしょう? そういう 何か誤解があるかな? ソースコードを文字列として生成してevalして, メソッ ドを定義できればいいだけですけども... >のはプログラムがデータとして扱えるlispなどのおはこだと思うの >ですが…. (誤解がないとして:) それはそうだと思うのですが, ある目的があって, それを実現するには動的に (ソース)コードを生成する方法を採ることが良いと考えたからですけどね. __ .........................................石塚 圭樹@今はフリー(^^;;... ------->>また, アドレス変わりました!! e-mail: keiju@bc.mbn.or.jp <<---