20158


下記ともに`hoge.rb`と適当に名付けた1ファイル内にすべてのソースを書いています。

  * [ネストしたModule/ClassをRubyで定義する時のコーディングスタイルの話。 - Sooey](http://journal.sooey.com/242)

Rubyの入れ子のModuleの書き方ですが2通りあるようでして、

[code]

    module A
      module B
        def hoge
          puts 'hoge'
        end
      end
    end
    
    include A::B
    hoge #=> hoge
    
[/code]

だと問題なく動くのですが、

[code]

    module A::B
      def hoge
        puts 'hoge'
      end
    end
    
    include A::B
    hoge
    
[/code]

とした場合、

[code]

    hoge.rb:1:in `<top (required)>': uninitialized constant A (NameError)
        from -e:1:in `load'
        from -e:1:in `<main>'
    
[/code]

と出てうまくいきません。なぜなのでしょうか？

ちなみに、Railsを使ったプロジェクト(`helpers`ディレクトリ）でこのように`::`で繋げた書き方をみましたが、問題なく動いておりました。


CC BY-SA 3.0
2015-12-18T07:31:13.223
20153
2015-12-18T14:08:11.140
2015-12-18T14:08:11.140
9008
9008
question
ruby-on-rails ruby
::で入れ子のModuleを宣言するとNameErrorになる


問題ないケースでは、ここでいう`module A::B`の定義より前に、`module
A`の定義がされていると思います。質問で引用されたエラーは、`module A::B`のところで、`A`が未定義だと言っています。


CC BY-SA 3.0
2015-12-18T12:11:42.717
20158
2015-12-18T12:11:42.717
4010
20153
answer