ようへいの日々精進XP

よかろうもん

2018 年 07 月 17 日 (火)

ジョギング

  • 香椎浜 x 2 周
  • 昨晩走った疲労が抜けていない感じと暑さでバテバテだった

日課

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

夕飯

  • 冷製パスタを作る
  • 冷製といっても茹でたパスタを水でしめてからオリーブオイルで似たベーコンやトマト等を掛けるだけなんだけど, 手軽でそこそこ美味しい

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

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

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

オブジェクト指向 (16)

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

module Mod
  def Mod.foo
    puts 'Mod'
  end
end

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

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

Cls2.new.foo

以下, 解答.

  1. 例外発生 (NoMethodError が発生)

以下, irb にて確認.

irb(main):001:0> module Mod
irb(main):002:1>   def Mod.foo
irb(main):003:2>     puts 'Mod'
irb(main):004:2>   end
irb(main):005:1> end
=> :foo
irb(main):006:0> 
irb(main):007:0* class Cls1
irb(main):008:1>   include Mod
irb(main):009:1>   def Cls1.foo
irb(main):010:2>     puts 'Cls1'
irb(main):011:2>   end
irb(main):012:1> end
=> :foo
irb(main):013:0> 
irb(main):014:0* class Cls2 < Cls1
irb(main):015:1>   def Cls2.foo
irb(main):016:2>     puts 'Cls2'
irb(main):017:2>   end
irb(main):018:1> end
=> :foo
irb(main):019:0> 
irb(main):020:0* Cls2.new.foo
NoMethodError: undefined method `foo' for #<Cls2:0x00556c0c2f35c8>
...

以下, 解説より抜粋.

  • Cls2, Cls1, Mod の foo メソッドは, 何れもクラスメソッドとして定義している
  • Cls2.new.foo で呼び出している foo メソッドはインスタンスメソッドである為, 例外 NoMethodError が発生する

オブジェクト指向 (17)

以下のコードを実行すると何が表示されるか.

class A
  @@a = 0
  def initialize
    @@a = @@a + 1
  end
  
  def A.a
    @@a
  end
end

class B < A
end

A.new
A.new
B.new
B.new
p A.a

以下, 解答.

  1. 4 が出力される

以下, irb にて確認.

irb(main):001:0> class A
irb(main):002:1>   @@a = 0
irb(main):003:1>   def initialize
irb(main):004:2>     @@a = @@a + 1
irb(main):005:2>   end
irb(main):006:1>   
irb(main):007:1*   def A.a
irb(main):008:2>     @@a
irb(main):009:2>   end
irb(main):010:1> end
=> :a
irb(main):011:0> 
irb(main):012:0* class B < A
irb(main):013:1> end
=> nil
irb(main):014:0> 
irb(main):015:0* A.new
=> #<A:0x0055d9cb989f18>
irb(main):016:0> A.new
=> #<A:0x0055d9cb97fb30>
irb(main):017:0> B.new
=> #<B:0x0055d9cb97d4c0>
irb(main):018:0> B.new
=> #<B:0x0055d9cb972ae8>
irb(main):019:0> p A.a
4
=> 4

以下, 解説より抜粋.

  • クラス変数はスーパークラス, サブクラス間で共有される
  • クラス A の initialize は, A 及び B のインスタンス化により, 4 回呼びだされることになり @@a が 4 回更新される

フムフム.