初めてrailsを触った時、
クラス・モジュールの継承知識がないまま以下の文を見たので
『なんでApplicationクラスがApplicationクラスを継承してんだよ』
と頭の中が?でいっぱいになった思い出があります。
config/application.rb
module Hoge
class Application < Rails::Application
#省略
end
end
ちょっとは理解が深まったので改めて継承関係を確認してみることに
$ rails console
Applicationクラスの親クラスを表示(継承関係は見えているが一応、、、)
irb(main):001:0> Application.superclass
Traceback (most recent call last):
1: from (irb):1
NameError (uninitialized constant Application)
ん、なんでだ?Applicationクラスじゃないのか?
と思ったがコードを見るとHogeモジュールに属しているじゃないか。
モジュール配下にあるクラスは
モジュール名::クラス名
で取得できます。
irb(main):003:0> Taskleaf::Application.superclass
=> Rails::Application
そりゃそうですよね。
Hogeモジュール配下のApplicationクラスは
Railsモジュール配下のApplicationクラスを継承していたんですね。
同じApplicationという名前のクラスだが、
モジュールで名前空間を作ることで区別できているんです。
Rails::Applicationクラスの親クラスはどうなっているんだろう?
ancestorsメソッドでみてみましょう。
irb(main):004:0> Rails::Application.ancestors
=> [Rails::Application, Rails::Engine, Rails::Railtie, Rails::Initializable, ActiveSupport::ToJsonW
ithActiveSupportEncoder, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, A
ctiveSupport::Tryable, ActiveSupport::Dependencies::Loadable, Kernel, BasicObject]
なんじゃこりゃ、みたことないモジュールやクラスがいっぱい、、、
今度調べてまとめるかな。