In article <1010568827.806757.16317.nullmailer / ev.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> そうですね。これは @_v をアクセス(privateな)accessorでごまか
> すなどの方法は考えられないでもないですが、別の名前の衝突の危
> 険を招くだけかもしれません。

これはちょっとよくわかりませんでした。

> そうかもしれませんねえ。となると、classでもmoduleでもない新
> しいなにかを導入する必要がありますね。それがpackageとか
> selector namespaceなのかもしれませんが。

たぶん。

Java ベースだとインスタンス変数とメソッドが似通った形式なので、両者が
同じような namespace になるというのは自然ですが、Ruby では完全に形式が
異なるのでそこまで自然にはならないかも知れません。でも、概念は同じなの
で、そうやっても悪くはないような気がします。

eval とか、instance_eval とか、怪しげなところはいろいろとあるわけです
が。

> selector namespaceについては、一番しょっちゅう口にする私でさ
> えも、どのような問題があり、どのように解決すべきか、どのよう
> に実装すべきかについてほとんど把握してません。
> 
> 実際に取り掛かれるのはいつになることやら。いろんな論文を読ん
> でるとしょっちゅう「あ、これはselector namespaceで解決できる
> んじゃ」とは感じるのですが、具体化するのは全然別の話ですね。
> 
> というか、だれかが研究ネタにしてくれるとそれはそれで望ましい
> ような。

Ruby レベルで selector namespace の仮実装を作るのがいいんじゃないです
かね。要するに、メソッドが定義されるたびに中身をすり替えて、caller で
呼び出し元を調べて呼び出し元から見えるはずのメソッドを呼び直すようなも
のにしちゃえばいいわけでしょう?

% ruby -e '
class Module
  def method_added(name)
    p [self, name, caller]
  end
end
class C
  def f
  end
end
'
[Module, :method_added, ["-e:3"]]
[C, :f, ["-e:8"]]

うぅむ。method_added 自体も呼ばれるのはちょっと意表をつかれましたが、
どうにでもなりそうですね。

ただ、super の挙動を(alias がある時なども含めて)完全に理解しないとうま
く動かないかも。

インスタンス変数も厄介ですが、気にしないのが簡単かな。無視しないなら、
ファイル f 中の @_x を self.f_x に置換してしまって、ぜんぶ accessor 経
由でやるようにするとか。require をすり替えれば自動的にやることも可能で
すね。もちろん、parse とかはせずに、乱暴に文字列置換でやる、と。実用に
はなりませんが実験ということで。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)