前置き

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

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モジュールということでしょうか(クラスのモジュールとは?)?