Rubyの名前解決は自分の入っているモジュールの兄弟をチェックしない
module Foo quux = 1 class Bar def baz print quux end end p Bar.new.baz # undefined local variable or method `quux' end
quuxをdefしても同じ。クラスのメソッド内で修飾なしで使われた名前はまずローカル変数かどうかをチェックして、それから自分のメソッド、親クラスのメソッド・・・とたどっていき、Objectで止まるのだと思われる。
Pythonでは修飾なしの名前はローカル変数をチェックした後、外のスコープへとたどっていき、グローバル(モジュールスコープ)で止まる。self.quuxなら自分のメンバ、親クラスのメンバ、、、とたどってobjectで止まる。
Javaはthisを省略できるけど、どうなってるんだろうか。ネストしたクラスを作った場合に外側のクラスの変数に修飾なしでアクセスできるんだったっけ。
ところでmodule_functionした上で修飾して呼んだら呼べたんだけどこうしないといけないのかな??もっと楽な方法がある??
module Foo def quux 1 end class Bar def baz print Foo::quux end end module_function :quux p Bar.new.baz end