ようへいの日々精進XP

よかろうもん

2018 年 07 月 13 日 (金)

ジョギング

  • お昼休みに
  • 香椎浜 x 2 周
  • 右足の太ももの前に痛み
  • 右半身と左半身のバランスが悪い感じ

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

暑かったけど

  • 夕方からは風が心地よい感じで, ずっと外で呑んでいたい気分になった

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (3) オブジェクト指向系問題 (2) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

オブジェクト指向 (7)

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

module Mod
  def foo
    puts 'Mod'
  end
end

class Cls1
  def foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  include Mod
  undef foo
end

Cls2.new.foo

以下, 解答.

  1. 例外発生

以下, irb

... 省略 ...
Cls2.new.fooirb(main):018:0>
irb(main):019:0* Cls2.new.foo
NoMethodError: undefined method `foo' for #<Cls2:0x007ffe538c53f8>

以下, 解説より抜粋.

  • Cls1 クラスで定義された foo は, Cls2 クラスで undef されているので foo の定義が取り消されている

ちなみに, undef しなかった場合には, 以下の通り Mod モジュールの foo メソッドが呼ばれる.

... 略 ...
irb(main):016:0> Cls2.new.foo
Mod
=> nil

オブジェクト指向 (8)

以下のコードを実行すると何が表示されるか, 尚, ファイル名は constant_1.rb とする.

class C1
  MSG = 'msg1'
  MSG2 = 'msg2'
  class Cls2
    MSG = 'C2.msg1'
    puts MSG
    puts MSG2
  end
  puts MSG
  puts MSG2
end

以下, 解答.

C2.msg1
msg2
msg1
msg2

以下, irb にて確認.

irb(main):001:0> class C1
irb(main):002:1>   MSG = 'msg1'
irb(main):003:1>   MSG2 = 'msg2'
irb(main):004:1>   class Cls2
irb(main):005:2>     MSG = 'C2.msg1'
irb(main):006:2>     puts MSG
irb(main):007:2>     puts MSG2
irb(main):008:2>   end
irb(main):009:1>   puts MSG
irb(main):010:1>   puts MSG2
irb(main):011:1> end
C2.msg1
msg2
msg1
msg2
=> nil

以下, 解説より抜粋.

  • クラスがネストしている場合, 定数の探索は, 自クラス→外側のクラスの順で行われる
  • 設問では 6 行目で宣言している MSG は, 5 行目で宣言している定数 MSG を参照する
  • 7 行目の MSG2 は, 3 行目で宣言している MSG2 を参照する

ちなみに, 以下のようなコードだった場合にどのように出力されるか.

class Cls1
  MSG = 'msg1'
  MSG2 = 'msg2'
  class Cls2
    MSG = 'Cls2.msg1'
    puts Cls1::MSG
    puts MSG2
  end
  puts Cls2::MSG
  puts MSG2
end

以下, 解答.

msg1
msg2
Cls2.msg1
msg2

以下, irb にて確認.

irb(main):001:0> class Cls1
irb(main):002:1>   MSG = 'msg1'
irb(main):003:1>   MSG2 = 'msg2'
irb(main):004:1>   class Cls2
irb(main):005:2>     MSG = 'Cls2.msg1'
irb(main):006:2>     puts Cls1::MSG
irb(main):007:2>     puts MSG2
irb(main):008:2>   end
irb(main):009:1>   puts Cls2::MSG
irb(main):010:1>   puts MSG2
irb(main):011:1> end
msg1
msg2
Cls2.msg1
msg2
=> nil

フムフム.