ようへいの日々精進XP

よかろうもん

2018 年 08 月 01 日 (水)

ジョギング

  • 香椎浜 x 2 周
  • なんかギクシャクしている感じ
  • 右足の太もも裏, お尻にかけて痛み

日課

  • お休み

Fukuoka.rb

今日は, awspec に新しいリソースタイプを追加する作業を行った.

早速, マージして頂き, ありがたや, ありがたや.

帰宅時に大濠公園の花火大会とバッティングしたけど, 無難に香椎まで帰ってくることが出来た.

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 基礎力確認試験 (2) オブジェクト指向 (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)

オブジェクト指向 (6)

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

module Mod1; end
module Mod2; end
class Cls1
  prepend Mod1
end
class Cls2 < Cls1
  prepend Mod2
end
p Cls2.ancestors

以下, 解答.

  1. [Mod2, Cls2, Mod1, Cls1, Object, Kernel, BasicObject]

以下, irb にて確認.

irb(main):001:0> module Mod1; end
=> nil
irb(main):002:0> module Mod2; end
=> nil
irb(main):003:0> class Cls1
irb(main):004:1>   prepend Mod1
irb(main):005:1> end
=> Cls1
irb(main):006:0> class Cls2 < Cls1
irb(main):007:1>   prepend Mod2
irb(main):008:1> end
=> Cls2
irb(main):009:0> p Cls2.ancestors
[Mod2, Cls2, Mod1, Cls1, Object, Kernel, BasicObject]
=> [Mod2, Cls2, Mod1, Cls1, Object, Kernel, BasicObject]

以下, 解説より抜粋.

  • prepend されたモジュールは, prepend した対象のクラスよりも先にメソッドの探索が行われる

オブジェクト指向 (7)

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

# コード 
class Example
  def hoge
    self.piyo
  end
  [ x ]
  def piyo
    puts 'piyo'
  end
end
Example.new.hoge

# 実行結果
piyo

以下, 解答.

  1. protected
  2. public
  3. 何も記述しない

以下, 解説より抜粋.

  • self.piyopiyo メソッドに self レシーバーをつけている為, piyo メソッドが private だとエラーとなる
  • private 以外の protected, public, 何も記述しない場合は self.piyo で呼び出すことが出来る

オブジェクト指向 (8)

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

class Object
  X = 'X'
  def self.const_missing a
    p "#{a}"
  end
end
Y

以下, 解答.

  1. "Y"

以下, irb にて確認.

irb(main):001:0> class Object
irb(main):002:1>   X = 'X'
irb(main):003:1>   def self.const_missing a
irb(main):004:2>     p "#{a}"
irb(main):005:2>   end
irb(main):006:1> end
=> :const_missing
irb(main):007:0> Y
"Y"
=> "Y"

以下, 解説より抜粋.

  • 定数が見つからない場合, Module#const_missing が実行される
  • Module#const_missing はオーバーライトが可能である
  • 設問コードには定数 Y は存在しておらず, Object クラスには const_missing が定義されている
  • トップレベルは Object クラスなので, Object クラスに定義された const_missing が実行され Y が表示される

オブジェクト指向 (9)

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

# コード
class C
  def hoge
    puts 'A'
  end
end

module M
  refine C do
    def hoge
      puts 'B'
    end
  end
end

c = C.new
c.hoge
[ x ] M
c.hoge

# 実行結果
A
B

以下, 解答.

  1. using

以下, irb にて確認.

irb(main):001:0> class C
irb(main):002:1>   def hoge
irb(main):003:2>     puts 'A'
irb(main):004:2>   end
irb(main):005:1> end
=> :hoge
irb(main):006:0> 
irb(main):007:0* module M
irb(main):008:1>   refine C do
irb(main):009:2*     def hoge
irb(main):010:3>       puts 'B'
irb(main):011:3>     end
irb(main):012:2>   end
irb(main):013:1> end
=> #<refinement:C@M>
irb(main):014:0> c = C.new
=> #<C:0x00562753ea6098>
irb(main):015:0> c.hoge; using M; c.hoge
A
B
=> nil

以下, 解説より抜粋.

  • refine で再定義したメソッドを有効にするには, using を利用する

フムフム.