[ruby-list:496] Re: meta-level features(Re: bug? and question)
From:
Date:
1996-09-11 08:18:55 UTC
List:
ruby-list #496
けいじゅ@SHLジャパンです. In [ruby-list :00489 ] the message: "[ruby-list:489] Re: meta-level features(Re: bug? and question) ", on Sep/04 16:30(JST) matz@caelum.co.jp (Yukihiro Matsumoto) writes: >ストラクトは確かにクラスの一種です.もっともストラクトのメン >バはインスタンス変数ではありませんけど. そうなんだ... >できます.実装上は特異メソッドを持つクラスは本当のクラスから >名前の無いクラスにChangeClassしています.これを処理形内部で >は特異クラス(singleton class)と呼んでいます. きっと, 特異メソッドを持つオブジェクトはという意味ですよね? つまり, 特 異メソッドを持つインスタンスは特異クラスをもっているわけですね? >また,全てのクラスオブジェクトは必ずこの特異クラスを持ってい >てこれがクラスのメタクラスになっています. ここでクラスメソッドが定義されているわけですね. >>objectからクラスを得る関数. >これは悩ましいところなんです.というのはもともとKernel#type >というメソッドでobjectのクラスを得ることができていたのですが, >lib/safe.rbを実装する途中でオブジェクトからクラスをとること >ができてはセキュリティは存在できないことに気が付いて,現在の >名前を返す仕様になりました. ここでいっているセキュリティって何ですか? ソースコードからしか実行できないrubyにセキュリティという概念があるとも 思えませんが... >これはeval(object.type)で実現して頂くしか無いのではないかと >思います. これだと, 特異クラスを取り出すことはできなくなりますね... >|objectからモジュールを得る関数 >これってextendしたモジュールの一覧が欲しいという意味ですね. >それとも自分のクラス(とその先祖)がインクルードしているモジュー >ルも欲しいですか? 後者の意味でした. >今の実装だと難しいですね.逆方向へのポインタを残していないの >で.あるモジュールをインクルードしているかどうか,なら >kind_of? で分かるんですけどねえ. へ? あるモジュールをインクルードしているかどうかが分かるなら, オブジェ クトからモジュールを得ることができてもおかしくないんですが... 逆なんで すか? モジュールからインクルードしているオブジェクトやクラスが分かる? >|objectから特異メソッドを含むメソッドを得る関数 >rubyではメソッドはオブジェクトでないので,取り出すのは難しい >と思います.これを変えた方が良いという意味なんでしょうか? これは, 関数の実体という意味ではなく, メソッドのスロットという意味です. 後で出てくるメソッドのアクセス権を保持するオブジェクトです. >|objectからメンバを得る関数 >Struct#membersのようなので構いませんか? ある名前のインスタン >ス変数が定義されているかどうかは defined? で分かるんですけど. アクセス権がないようなのでそれで良いと思います. >|クラスから, クラス名を得る関数 >|クラスから, スーパクラスを得る関数. >これは今はrubyからはできなかったように思います.できた方が良 >いですね. >|クラスから, モジュールを得る関数 >これもオブジェクトからモジュールをとるのと同じ理由で難しいで >す.どうしようかなあ. うーん. どういう内部構造をしているのだろう... >|クラスから, メソッドを得る関数 >|クラスから, メンバを得る関数. >インスタンス変数にはアクセス権は無いです.敢えていえば全部 >C++ でいう protected です.これは外部から参照したり,変更す >ることを考えていないので,知る必要も変更する必要もないと思い >ます.アクセスメソッドという項目があるのでなにか違うことを考 >えていらっしゃるのかも知れませんが. あ. 私の考え違いでした. >ちなみにrubyでアクセスメソッドといっているのはC++などでのイ >ンスタンス変数と同じような形式で呼び出せる単なるメソッドのこ >とです. では, メンバからアクセスメソッド(のスロット)を得る関数がありますね. >メソッドにはアクセス権がありますが,メタ情報で知る必要がある >のは publicなものだけではないでしょうか? 通常ではそれだけで十分だと思うのですが, どこまで必要になるかというと... あとは, メソッド名をある関数に渡してそれを引数にアクセス権を調べる方法 もありますね. ># 何が欲しいかと聞いておいて良い返事ができていませんね. 確かにできていない!! とはいっても具体的に目的があるわけでもないですか ら... MLF(Meta-Level-Featuer)の目的を考えなくてはなりませんね. 2つ例を考えて みました. 1. デバッガ. inspectみたいなものをユーザが独自に作れるため. 少なくとも, membersが必 要. あと, インスタンス変数に強制的にアクセスする機能が必要ですね. 良く 考えるとインスタンス変数名をとってきても, そこからアクセスする方法がな いと困りますね. 特に, Smalltalkのような pure ruby 環境を作りたいと思っているならこうい うプロトコルは必要そうです. 2. 動的クラス生成. 例えば, あるクラスを与えてその情報から新たなクラスを生成するなど. C++ のパラメトライズドクラスの動的版ですかね... 元クラスの情報が欲しくなり ますよね. もしかしたら, elispのedebug-defunのように, デバッグ用の関数やクラスを 生成するとかかも知れません. とはいっても... この様に考えると, 2の場合は, MLFとしてはそれほど機能は 必要ないのかも知れません. それよりも, rubyのソースコードを簡単に解析で きる機能の方が欲しいのかも... lispとは違い大変そうだ... でも, そういった意味でのMLFも面白いですね. 論理的なプログラム構造がオ ブジェクトとして取り扱えるというのも. __ .....................................石塚 圭樹@事開事.三井造船(株)... ------------->アドレス変わりました!! e-mail: keiju@csg.mes.co.jp <----