LoginSignup
1
0

More than 3 years have passed since last update.

ancestorsメソッドについて

Last updated at Posted at 2020-05-16

書籍で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.ancestorsの出力結果
[Nepal, World, Mountains, Object, Kernel, BasicObject]

と表示されます。
左から順に呼び出されるので、Nepalクラス内で定義したeverest_placeメソッドが取り出されることがわかります。

実際に結果を見ていきます。

出力結果
nepal

ちゃんと、Nepalクラス内で定義したeverest_placeメソッドの戻り値がかえってきました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0