ようへいの日々精進XP

よかろうもん

2018 年 03 月 22 日(木)

体調不良

  • 終日, 体が辛くて寝て, 起きてを繰り返す

ジョギング

  • 当然, お休み

日課

  • お休み

今日のるびぃ ~ Ruby 技術者認定試験 Gold 演習問題を解いていく (5) ~

もう何度か解いているけど, Ruby 技術者認定試験合格教本 の演習問題と模擬試験を数問ずつ解いていく. ポイントは, 問題が何について問われているかがちゃんと理解出来ていること.

Q13. オブジェクト指向

以下のコードを実行した時に, 何が出力されるか.

module M
  def foo
    self.class
  end
end

class C
  include M
end

p C.new.foo

以下の通りに出力される.

C

以下, irb での実行結果.

...
irb(main):011:0* p C.new.foo
C
=> C

以下, 解説より抜粋.

  • include はモジュールを暮らすに Mix-in する
  • foo メソッド内の self は C.new で生成されたオブジェクト自身を返す為, self.class で C が出力される

Q14. オブジェクト指向

以下のコードを実行するとどうなるか.

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

以下のように出力される.

cls2
cls1
Mod

以下, irb での実行例.

...
irb(main):022:0* Cls2.new.foo
Cls2
Cls1
Mod
=> nil

メソッドは 「自クラス -> インクルードしているモジュール -> スーパークラス -> スーパークラスのインクルードしているモジュール」で探索される (prepend は異なる).

Q15. オブジェクト指向

以下のコードを実行するとどうなるか.

class Cls1
  def Cls1.foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  def foo
    puts 'Cls2'
  end
end

Cls2.foo

以下のように出力される.

Cls1

以下, irb での実行例.

...
irb(main):013:0* Cls2.foo
Cls1
=> nil
irb(main):014:0> Cls2.new.foo
Cls2
=> nil

以下, 解説より抜粋.

  • Cls2 は Cls1 を継承している為, Cls2.foo ではクラスメソッドの foo を呼び出す
  • Cls2#foo はインスタンスメソッド

解説の以下の部分が理解出来てない.

Cls2 の foo はインスタンスメソッドの為, Cls1 のクラスメソッド foo が実行されます.

ふむふむ.