moduleのスコープについて調べてみた
いろいろ気になったので調査.以下のようなコードを用意.
module Parent CONST = 2 end module Parent module Base BASE_CONST = 3 end end module Parent module Base class Child class << self def bar puts BASE_CONST puts CONST end end end end end class Hoge include Parent::Base def fuga puts BASE_CONST puts CONST end end class Huga include Parent def baz puts CONST puts BASE_CONST end end
% irb >> foo = Hoge.new => #<Hoge:0x......> >> foo.fuga # CONST は Parent にあるので include Parent::Base だと見えない 3 NameError: uninitialized constant Hoge::CONST from /home/ogawa/work/module-test2.rb:29:in 'fuga' from (irb):6 >> zoo = Huga.new => #<Huga:0x......> >> zoo.baz # BASE_CONST は Parent::Base にあるので include Parent だと見えない(これはあたりまえ) 2 NameError: uninitialized constant Huga::BASE_CONST from /home/ogawa/work/module-test2.rb:38:in 'baz' from (irb):8 >> Parent::Base::Child.bar # Child は Parent::Base にあるので,Parent, Parent::Base ともに見える 3 2 => nil