ようへいの日々精進XP

よかろうもん

2018 年 07 月 12 日 (木)

ジョギング

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

日課

  • お休み

夕飯

  • パスタを作る

今日のるびぃ ~ 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)

オブジェクト指向 (4)

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

class A
  @@x = 0
  class << self
    @@x = 1
    def x
      @@x
    end
  end
  def x
    @@x = 2
  end
end

class B < A
  @@x = 3
end

p A.x

以下, 解答.

3 が表示される

以下, irb による確認.

irb(main):001:0> class A
irb(main):002:1>   @@x = 0
irb(main):003:1>   class << self
irb(main):004:2>     @@x = 1
irb(main):005:2>     def x
irb(main):006:3>       @@x
irb(main):007:3>     end
irb(main):008:2>   end
irb(main):009:1>   def x
irb(main):010:2>     @@x = 2
irb(main):011:2>   end
irb(main):012:1> end
=> :x
irb(main):013:0> 
irb(main):014:0* class B < A
irb(main):015:1>   @@x = 3
irb(main):016:1> end
=> 3
irb(main):017:0> 
irb(main):018:0* p A.x
3
=> 3

以下, 解説より抜粋.

  • クラス変数は, スーパークラスとサブクラス間で共有される
  • 設問では, クラス B の @@x = 3 が変数 x の最終定義になる

オブジェクト指向 (5)

以下の実行結果になるように, [ x ] に記述する適切なコードを選ぶ.

# コード
module M
  def hoge
    puts 'hoge'
  end
end

class A
  [ x ] M
end

A.hoge

# 実行結果
hoge

以下, 解答.

extend

以下, irb による確認.

irb(main):001:0> module M
irb(main):002:1>   def hoge
irb(main):003:2>     puts 'hoge'
irb(main):004:2>   end
irb(main):005:1> end
=> :hoge
irb(main):006:0> 
irb(main):007:0* class A
irb(main):008:1>   extend M
irb(main):009:1> end
=> A
irb(main):010:0> 
irb(main):011:0* A.hoge
hoge
=> nil

以下, 解説より抜粋.

  • モジュール内のメソッドをクラスメソッドとして取り込むには extend を用いる

オブジェクト指向 (6)

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

class A
  $a = self
  def hoge
    $b = self
  end
end

a = A.new
print A == $a, A.new == $b

以下, 解答.

truefalse が出力される

以下, irb による確認.

irb(main):001:0> class A
irb(main):002:1>   $a = self
irb(main):003:1>   def hoge
irb(main):004:2>     $b = self
irb(main):005:2>   end
irb(main):006:1> end
=> :hoge
irb(main):007:0> 
irb(main):008:0* a = A.new
=> #<A:0x00559d516cbcb0>
irb(main):009:0> print A == $a, A.new == $b
truefalse=> nil

以下, 解説より抜粋.

  • クラス定義中の self は, そのクラスオブジェクトである
  • インスタンスメソッド中の self は, そのクラスのオブジェクトである
  • $a にはクラス A が代入され, $bhoge が実行されなければ値は代入されないので nil となる

truetrue と出力される為には, 以下のように実行する.

irb(main):010:0> print A == $a, A.new.hoge == $b
truetrue=> nil

フムフム.