Rubyにとってモジュール定義とクラス定義は同じであるようなときがある?
前置き
(適切なタイトルが思いついておりません)
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モジュールということでしょうか(クラスのモジュールとは?)?