From: matz@... (Yukihiro Matsumoto) Date: 1997-07-10T17:38:38+09:00 Subject: [ruby-list:3320] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] まつもと ゆきひろです In message "[ruby-list:3319] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])]" on 97/07/10, 石塚圭樹 writes: |けいじゅ@今はフリー(^^;;;です. |なかなか使いやすそうですね. ただ, 先の context-class が指定できないの |がローカルクラスを作る時面倒です. っていうか,Class.new/Module.newは定数を定義しないので context-classというのは存在しません.戻り値として与えられる クラス(あるいはモジュール)を定数なり変数なりに代入してくださ いませ.定義部はイテレータブロックを使っているのでバインディ ングは変更できません. | module A | ... | end | |の Aは, モジュールが代入された変数でもいいんですよね? つまり, | | a = Foo::Bar::Baz # あるモジュール | module a | ... | end | |も OK? それなら問題ないかなあ... だめです.Aはかならず定数でなければなりません.Foo::Bar::Baz に機能を追加したければ module Foo module Bar moduel Baz end end end とするしかないですね. |>あと,トップレベルでは自動的にprivateになる仕様もこういう時 |>には面倒でした. | |なにがでしたっけ?? トップレベル(class/moduleの外)でdefするとprivate methodにな ります.これはトップレベルでの定義されるのは関数(的メソッド) であろう,ということからです.普段は確かにそうなんですけど, こういう時は不便ですよね. |定数はともかく, メソッド定義は関数的でないと使いづらい場合も多いと思い |ます. とくに, 動的にコードを生成する時には. 動的にコードを生成する? lispじゃないんだから. |ここまで話しが進んだので, 他のAPIのリクエストも出しましょう. | | Module#def_method(name, source) | メソッドを定義する. sourceって文字列なんですか? どういう感じなんだろう? | Module#class_variables | クラス変数の一覧 クラス定数ですよね.Module#constantsかしら? | Module#class_variable_value(name) | クラス変数の値 Module@constant_value(name)かな? | Module#class_variable_value(name, value) | クラス変数の値を設定する Module@constant_value(name)=valueでは? | (Module#instance_variables | インスタンス変数の一覧. 必要か?) オブジェクト毎に違うわけですから,Moduleとしては得られないで しょう. | Module#includes | インクルードモジュールの一覧を返す. これ,現在の実装では情報を持っていません.実装するのはちょっ と面倒ですねえ. | Object#methods | メソッドと(private/public)の組みの一覧を返す. これだとModule/Classそのもののmethodを取れませんね.重複しちゃ うから. | Object#extends | エクステンドモジュールの一覧を返す. これも情報が取ってないです.どうしよう. |# あと, undef系があるかな... まあ,よいですけど….なんか,ここで既に大げさで(完全性は満 たしているかも知れませんが),rubyらしくない気がしてます. |あと, 松本氏はいやがるかも知れませんが, | | Module#methods_sources | メソッドと(private/public)とソースコードの組みの一覧を返す. | Object#methods_source | メソッドと(private/public)とソースコードの組みの一覧を返す. | |があるかな. いやがるもなにも,どうやって実装するんですか? さすがにMOPの ような普段使わない機能のためにメソッド毎のソースを保存して普 段の効率を落す気は無いですし,それ以外の方法って思い付かない ですし.それにCで実装されているメソッドにはソースは無いです よね. |あと, APIとしては, Object#instance_variables ではインスタンス変数を表 |す特別なオブジェクトを返す方法もありますね. そうすると, |Object#instance_variable_valueはいらなくなって, |InstanceVariable#value みたいなメソッドが必要になりますね(私個人として |は, こっちのインターフェイスの方が好きなのですが...). あと, イテレータ |とする方法もあるかな? | |object.instance_variables do | |name, access, value| | ... |end | |イテレータにすると値まで取り出せるわけですね. インスタンス変数のaccessってなに? 最終的な印象としてはちょっと抵抗があるというのが事実です.ま あ,とりあえずは抵抗の無い Module#constants Object#methods くらいを導入しようかなあ.あ,でもクラスに対してmethodsって 聞いた時にはクラスオブジェクトの知っているメソッドではなく, クラスインスタンスの知っているメソッドを返して欲しいなあ. まつもと ゆきひろ /:|)