体調不良
- 終日, 体が辛くて寝て, 起きてを繰り返す
ジョギング
- 当然, お休み
日課
- お休み
今日のるびぃ ~ 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 が実行されます.
ふむふむ.