ようへいの日々精進XP

よかろうもん

2018 年 04 月 04 日(水)

ジョギング

日課

  • お休み

Fukuoka.rb

SRE 本輪読会の会場で Fukuoka.rb も開催されていて、@udzura さんに awspec の generator 実装について質問させて頂いた。

SRE 本輪読会

  • 少しお酒が入っていて、いつも以上に円滑に議論が進んだ気がする
  • 各社さんの色々な状況が伺えてとても参考になった
  • Bashユニットテストフレームワーク shunit2 を教えてもらった

夕飯

  • 輪読会帰りに串かつ

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

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

Q13. オブジェクト指向

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

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

クラス変数はスーパークラスとサブクラス間で共有されるため...

  1. 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

以下, 解説より抜粋.

  • クラス変数 (@@) はスーパークラス, サブクラス間で共有される
  • 設問では, クラス B の @@x = 3 が最終的に適用される

Q14. オブジェクト指向

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

module M
  def hoge
    puts 'hoge'
  end
end

class A
  [ x ] M
end

A.hoge

実行結果.

hoge

A.hoge はクラスメソッドなので, モジュール内のメソッドをクラスメソッドとして取り込むには...

  1. extend

以下, irb による実行例.

...
irb(main):011:0* A.hoge
hoge
=> nil

以下, 解説より抜粋.

  • モジュール内のメソッドをクラスメソッドとして取り込む場合, extend を利用する

Q15. オブジェクト指向

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

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

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

クラス定義中の self は, そのクラスオブジェクトで, インスタンスメソッド中の self はそのクラスのオブジェクトとなるので...

  1. 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:0x0055a85edf61a8>
irb(main):009:0> print A == $a, A.new == $b
truefalse=> nil

以下, 解説より抜粋.

  • クラス定義中の self は, そのクラスのオブジェクトとなる
  • インスタンスメソッド中の self は, そのクラスのオブジェクトとなる
  • $a にはクラス A が代入されるが, $b は, hoge が実行されなければ値が代入されない為, nil となる
# hoge を実行すると以下のようになる
irb(main):010:0> print A == $a, A.new.hoge == $b
truetrue=> nil

フムフム