From: matz@... (Yukihiro Matsumoto) Date: 1997-08-17T02:01:04+09:00 Subject: [ruby-dev:146] Re: meta programming features まつもと ゆきひろです In message "[ruby-dev:137] Re: meta programming features" on 97/08/15, 石塚圭樹 writes: |けいじゅ@日本ラショナルです. |> * 特異メソッドが定義されているオブジェクトに対しては特異メ |> ソッドを返し,そうでないオブジェクトに対しては通常のクラ | ^^^^^^^^ | 特異クラスですね? です.間違いですね. |この問題は, | | class << foo ... end | |がある限り解決しないと思いますが... これはclass << fooの構文内では仮想的なクラスを見せているだけ だ,というモデルを採用することにします.つまり,現在の実装で は特異クラスを使っているが言語の採用しているモデルでは必ずし も特異クラスの存在する必要はないと言うことで. ついでに,この仮想クラス(特異クラスのこと)のインスタンスを作 ることと,サブクラスを作ることを禁止するようにしましょうね. |そういったわけで, Object#eval() も通常クラスへの登録が基本で良いと思う |んですが... というかやっぱり関数的な eval に求められる挙動とfoo.evalの形 で呼ばれることを想定した時に求められる挙動とではかなり違って いるように思います. たとえば定数アクセスを例にとると * 関数的アクセスの場合には呼ばれた時点での静的なスコープも 参照して,「その場所にコードがあったのと同じ動作」を実現 して欲しい. * メソッド的アクセスの場合には(そのインスタンス内部からの アクセスということで)適切な静的なスコープは存在しないだ けでなく,メソッド呼び出し元のスコープを参照するべきでは ない という違いがあります.これは定数の定義や,メソッドやクラスな どの定義に関してもいえることです. ですから,「そのインスタンスのスコープでevalするメソッド」を 用意するにしても,現状のevalと共有することは(おそらく)不可能 だと思います.せめて,名前を変える必要があるのでは. |特異メソッドが存在するか調べる方法があれば, foo.eval("def foo.f...") |を使えるのですが... foo.respond_to?("f") と foo.type.methods.include?("f") を組 み合わせると調べられるのでは? まつもと ゆきひろ /:|)