20167


## 前置き

（適切なタイトルが思いついておりません）

[ruby on rails - ::で入れ子のModuleを宣言するとNameErrorになる -
スタック・オーバーフロー](https://ja.stackoverflow.com/questions/20153/%e3%81%a7%e5%85%a5%e3%82%8c%e5%ad%90%e3%81%aemodule%e3%82%92%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%a8nameerror%e3%81%ab%e3%81%aa%e3%82%8b)  
とも関連するのですが上記質問では、未定義なモジュールを`::`で作り出すことはできないという結論になりました。

そこで、今回

### モジュールを先にちゃんと定義

[code]

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

とした場合、問題ありませんでした。

## 疑問

### 同名のクラスを先に定義

私は以前の質問で、

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

と書いており、この部分がどうしても気になった結果、どうもクラスにモジュールと同名のものがあれば問題なく動くのではないかと思って、下記ソースを試してみました。

[code]

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

そうすると、確かに問題なく動作しました。

モジュールとクラスの違いがよくわからなくなってしまいました。  
モジュールとクラスは別という認識なので、同名のクラスを用意したときにNameErrorにならないのが変に思えます。

そもそも  
Aがモジュールの場合、  
`module A::B`はAモジュールにネストしたBモジュールということになりますが、  
Aがクラスの場合、  
`module A::B`はAクラスのBモジュールということでしょうか（クラスのモジュールとは？）？


CC BY-SA 3.0
2015-12-19T01:01:58.373
20164
2016-01-10T03:28:18.650
2017-04-13T12:52:39.113
-1
9008
question
ruby
Rubyにとってモジュール定義とクラス定義は同じであるようなときがある？


`module A::B` は A の下にモジュール B を作るということで、A が クラスかモジュールかはどちらでもいいです。

なお、クラスもモジュールの一種です。


CC BY-SA 3.0
2015-12-19T02:11:27.157
20167
2015-12-19T03:03:52.713
2015-12-19T03:03:52.713
3249
3249
20164
answer


moduleはmoduleにネストさせることが出来ます。  
つまり

[code]

    module A ; end
    module A::B ; end
    module A::B::C ; end
    
[/code]

といった事が可能です。

[code]

    Class.superclass #-> Module
    
[/code]

となっています。つまりClassクラスはModuleクラスを継承していることになります。  
ですから、

[code]

    class A ; end
    module A::B ; end
    
[/code]

と、モジュールをクラスにネストさせることも可能です。


CC BY-SA 3.0
2016-01-10T03:28:18.650
20795
2016-01-10T03:28:18.650
12758
20164
answer