質問: 前置き --- (適切なタイトルが思いついておりません) ruby on rails - ::で入れ子のModuleを宣言するとNameErrorになる - スタック・オーバーフロー とも関連するのですが上記質問では、未定義なモジュールを`::`で作り出すことはできないという結論になりました。 そこで、今回 ### モジュールを先にちゃんと定義 ``` module A end module A::B def hoge puts 'hoge' end end include A::B hoge #=> hoge ``` とした場合、問題ありませんでした。 疑問 -- ### 同名のクラスを先に定義 私は以前の質問で、 > > ちなみに、Railsを使ったプロジェクト(helpersディレクトリ)でこのように::で繋げた書き方をみましたが、問題なく動いておりました。 > > > と書いており、この部分がどうしても気になった結果、どうもクラスにモジュールと同名のものがあれば問題なく動くのではないかと思って、下記ソースを試してみました。 ``` class A end module A::B def hoge puts 'hoge' end end include A::B hoge #=> hoge ``` そうすると、確かに問題なく動作しました。 モジュールとクラスの違いがよくわからなくなってしまいました。 モジュールとクラスは別という認識なので、同名のクラスを用意したときにNameErrorにならないのが変に思えます。 そもそも Aがモジュールの場合、 `module A::B`はAモジュールにネストしたBモジュールということになりますが、 Aがクラスの場合、 `module A::B`はAクラスのBモジュールということでしょうか(クラスのモジュールとは?)?
回答: moduleはmoduleにネストさせることが出来ます。 つまり ``` module A ; end module A::B ; end module A::B::C ; end ``` といった事が可能です。 ``` Class.superclass #-> Module ``` となっています。つまりClassクラスはModuleクラスを継承していることになります。 ですから、 ``` class A ; end module A::B ; end ``` と、モジュールをクラスにネストさせることも可能です。