0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyのオブジェクト指向の宿題(1)

Posted at

宿題

以下のコードを実行するとどうのような結果になりますでしょうか?

module Mod
  def foo
    puts "Mod"
  end
end
class Cls1
  include Mod
  def foo
    puts "Cls1"
    super
  end
end
class Cls2 < Cls1
  def foo
    puts "Cls2"
    super
  end
end

Cls2.new.foo

悩んでいるところ

クラスCls1は特に他のクラスから継承する明記がないのに、superはどういうことでしょうか?

実際の実行結果

[35] pry(main)> Cls2.new.foo
Cls2
Cls1
Mod
=> nil

解説

原因

rubyのメソッドにとって、自分のクラス → インクルードしているモジュール → スーパークラス → スーパークラスのインクルードしているモジュールの順に検索されます。

流れ

Cls2クラスのインスタンスでfooを呼び出すと、Cls2クラスのfooが実行され、Cls2を画面に出力したあと、superでCls1クラスのfooを呼び出します。
=> Cls2
Cls1クラスのfooの中でCls1を画面に出力した後、superでModモジュールのfooを呼び出し、Modを画面に出力します。
=> Cls1
=> Mod

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?