書籍でancestorsメソッドについて、役立ちそうな情報が書かれていたのでまとめてみました。
class Mountains
end
class Nepal < Mountains
def everest_place
"nepal"
end
end
p Nepal.ancestors
p Nepal.class.superclass.superclass.superclass
[Nepal, Mountains, Object, Kernel, BasicObject]
BasicObject
継承関係を辿るときに、superclassだと一つ一つ辿っていかくちゃいけなくて、不便。
ancestorsメソッドを使えば今のクラスからBasicObjectまでを配列で取り出せて便利だなという程度の認識でした。(モジュールも含む)
module World
def everest_place
"china"
end
end
class Mountains
def everest_place
"india"
end
end
class Nepal < Mountains
include World
def everest_place
"nepal"
end
end
p Nepal.ancesters
nepal = Nepal.new
puts nepal.everest_place
上記のように、
❶Nepalクラスは、Worldモジュールをインクルードしているので、Worldモジュールのeverest_placeメソッドを使える
❷Nepalクラスは、Mountainsメソッドを継承しているため、Moutainsクラスのeverest_placeメソッドも使える
Nepalクラス内のeverest_placeメソッドも含めると、3つのeverest_placeメソッドがあったとします
どのeverest_placeメソッドが呼び出されるかによって、もちろん出力結果も変わってきますね。
そんな時に活躍するのが、ancestorsメソッドです。
p Nepal.ancestorsの出力結果を見てみると、
[Nepal, World, Mountains, Object, Kernel, BasicObject]
と表示されます。
左から順に呼び出されるので、Nepalクラス内で定義したeverest_placeメソッドが取り出されることがわかります。
実際に結果を見ていきます。
nepal
ちゃんと、Nepalクラス内で定義したeverest_placeメソッドの戻り値がかえってきました。