[ruby-list:489] Re: meta-level features(Re: bug? and question)

From: matz@... (Yukihiro Matsumoto)
Date: 1996-09-04 07:30:17 UTC
List: ruby-list #489
In message "[ruby-list:487] Re: meta-level features(Re: bug? and question)"
    on 96/09/04, 石塚圭樹 <keiju@shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 

|ストラクトであれば, このAPIで良いのですが... ストラクトもクラスの一種
|なんですよね?

ストラクトは確かにクラスの一種です.もっともストラクトのメン
バはインスタンス変数ではありませんけど.

|>具体的にはどのような機能が欲しいですか?
|
|欲しいかといわれると, 今は特に必要としていないので... あれば良いと思う
|機能で思いついたものを列挙します.
|
|rubyは特異メソッドがあるので難しいのですが... 確か, オブジェクト単位で
|モジュールをインクルード(エクテンド)できましたよね? まさか, 特異スーパ
|クラスというのはないですよね? 

できます.実装上は特異メソッドを持つクラスは本当のクラスから
名前の無いクラスにChangeClassしています.これを処理形内部で
は特異クラス(singleton class)と呼んでいます.

また,全てのクラスオブジェクトは必ずこの特異クラスを持ってい
てこれがクラスのメタクラスになっています.

|objectからクラスを得る関数.

これは悩ましいところなんです.というのはもともとKernel#type
というメソッドでobjectのクラスを得ることができていたのですが,
lib/safe.rbを実装する途中でオブジェクトからクラスをとること
ができてはセキュリティは存在できないことに気が付いて,現在の
名前を返す仕様になりました.

これはeval(object.type)で実現して頂くしか無いのではないかと
思います.

|objectからモジュールを得る関数

これってextendしたモジュールの一覧が欲しいという意味ですね.
それとも自分のクラス(とその先祖)がインクルードしているモジュー
ルも欲しいですか?

今の実装だと難しいですね.逆方向へのポインタを残していないの
で.あるモジュールをインクルードしているかどうか,なら 
kind_of? で分かるんですけどねえ.

|objectから特異メソッドを含むメソッドを得る関数

rubyではメソッドはオブジェクトでないので,取り出すのは難しい
と思います.これを変えた方が良いという意味なんでしょうか?

|objectからメンバを得る関数

Struct#membersのようなので構いませんか? ある名前のインスタン
ス変数が定義されているかどうかは defined? で分かるんですけど.

# あまり良い返事ができてませんねえ.

|クラスから, クラス名を得る関数
|クラスから, スーパクラスを得る関数.

これは今はrubyからはできなかったように思います.できた方が良
いですね.

|クラスから, モジュールを得る関数

これもオブジェクトからモジュールをとるのと同じ理由で難しいで
す.どうしようかなあ.

|クラスから, メソッドを得る関数
|クラスから, メンバを得る関数.
|
|メソッド, メンバはアクセス権があるので, その情報を取り扱えるように文字
|列とかではなくて, Member/Methodなどのインスタンスである方がよいと思い
|ます. 

インスタンス変数にはアクセス権は無いです.敢えていえば全部 
C++ でいう protected です.これは外部から参照したり,変更す
ることを考えていないので,知る必要も変更する必要もないと思い
ます.アクセスメソッドという項目があるのでなにか違うことを考
えていらっしゃるのかも知れませんが.

ちなみにrubyでアクセスメソッドといっているのはC++などでのイ
ンスタンス変数と同じような形式で呼び出せる単なるメソッドのこ
とです.

メソッドにはアクセス権がありますが,メタ情報で知る必要がある
のは publicなものだけではないでしょうか?

                                まつもと ゆきひろ /:|)

# 何が欲しいかと聞いておいて良い返事ができていませんね.

In This Thread

Prev Next