From: Shugo Maeda Date: 2005-10-13T16:35:39+09:00 Subject: [ruby-dev:27422] Re: selector namespace 前田です。 nobuyoshi nakadaさんは書きました: > もうひとつ思いついた疑問点は、スコープの外側のusingは影響するか、 > ということですが > > class Foo > def bar$zot > end > end > using bar > module Bar > foo = Foo.new > foo.zot(1) > using baz > foo.zot(2) > end > > a) 見える。zot(1)は bar$zot -> global$zot の順、zot(2)は > baz$zot -> bar$zot -> global$zot の順で探す > > b) 見えない。zot(1)は global$zot だけ、zot(2)は baz$zot -> > global$zot の順で探す > > c) スコープでusingが現れると外側のusingは見えなくなる。zot(1)は > bar$zot -> global$zot の順、zot(2)は baz$zot -> global$zot > の順で探す > > まぁaですかね。 aが便利そうですね。 そうすると、 Shugo Maedaさんは書きました: > ただし、該当メソッドが二つで、一方がglobalである場合、global > でない方を採用する。 というのは、 もっとも内側のスコープでusingされた名前空間の定義を優先する。 (globalは一番外側の仮想的なスコープでusingされているとみなす。) というルールにできそうです。 この方が自然ですね。 >>個人的には、ファイル単位、もしくはクラス・モジュール定義単位くらい >>の粒度で使えれば十分だと思いますので、条件文の中で使えなくてもいいん >>じゃないでしょうか? > > > エラーにするということですか? それとも BEGIN{p true} if false > のように実行文とは無関係に影響する? トップレベルかクラス・モジュール定義の直下に単独で現れる場合 以外はエラーでよいと思っていたのですが、BEGIN{}に合わせるのも 自然かもしれないですね。 -- 前田 修吾