From: Yukihiro Matsumoto Date: 2007-01-08T12:10:17+09:00 Subject: [ruby-dev:30107] Re: send/__send__ and private method まつもと ゆきひろです In message "Re: [ruby-dev:30103] Re: send/__send__ and private method" on Sun, 7 Jan 2007 17:52:05 +0900, SASADA Koichi writes: |Yukihiro Matsumoto wrote: |> この辺はもう一度いじるつもりがあるので放置しておいてください |> ませんでしょうか。 | | 了解しました。ちなみに、「こんなのを考えてる」という案があったら教えて |いただければと思います。 はい。こんな感じで。 (1) sendはpublicしかアクセスしない (2) sendもレシーバ付きメソッド呼び出しもprivateを「スキップ」。 現在は「エラー」。 (3) 関数型メソッド呼び出しは以下の順序でメソッド探索 * privateメソッド(BasicObjectまで) * publicメソッド(CLASS_OF(self)からBasicObjectまで) この結果、matzrubyのようにグローバルメソッドキャッシュテー ブルを使うならテーブルがふたつ必要になる。インラインメソッ ドキャッシュは変更の必要なし(だと思う)。 (4) <未確定> privateメソッドの呼び出しの探索は、現在メソッド を定義しているクラス(frame->the_class)から始まる。 ただし、instance_evalなどでselfがすりかわっている時には CLASS_OF(self)から。 これによりprivateメソッドはサブクラスでのオーバーライド ができなくなる。名称重複の危険性が減り、安心して関数的メ ソッドを使えるようになるが、メソッドの意味がかなり複雑に なるうえに「すりかわり」のチェックが負担になる? (5) send!, __send!の各メソッドは廃止。privateメソッドを呼ぶ ためのprivateメソッドfuncallが追加。使い方は funcall name, args... privateなのでobj.funcallという風には使えない。他のオブジェ クトのprivateメソッドが呼びたい時にはinstance_evalなどを 使う。 他のクラスのprivateメソッドを直接呼びたいという話があっ たような...。 まだ実装はしていませんが、どう実装するかは(matzrubyでなら)考 えてあります。 まつもと ゆきひろ /:|)