ようへいの日々精進XP

よかろうもん

2018 年 07 月 16 日 (月)

ジョギング

  • 夕方の涼しい時間帯で香椎浜 x 3 周
  • テンポよく走れた気がする

日課

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

とんだ休日

  • 新宮の美味しいパン屋さんにドライブがてら出掛けたが定休日...
  • そして, 竹林亭に向かうも大行列... 30 分くらいで自宅に戻ってきた
  • 結局, 自宅ちかくのビストロでハンバーグランチを食べて休日は終わった
  • 暑い日は自宅でエアコン付けてのんびりする, 連休最終日は近場よりも自宅でゆっくり過ごすということを夫婦で再認識した

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

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

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

オブジェクト指向 (13)

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

module Mod
  def foo
    puts 'Mod'
    super
  end
end

class Cls1
  def foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  prepend Mod
end

Cls2.new.foo

以下, 解答.

Mod と表示 Cls1 と表示

以下, irb にて確認.

irb(main):001:0> module Mod
irb(main):002:1>   def foo
irb(main):003:2>     puts 'Mod'
irb(main):004:2>     super
irb(main):005:2>   end
irb(main):006:1> end
=> :foo
irb(main):007:0> 
irb(main):008:0* class Cls1
irb(main):009:1>   def 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>   prepend Mod
irb(main):016:1> end
=> Cls2
irb(main):017:0> 
irb(main):018:0* Cls2.new.foo
Mod
Cls1
=> nil

以下, 解説より抜粋.

  • prepend で取り込まれたメソッドは, 元から定義されているメソッドよりも先に呼び出される
  • prepend で呼び出されたモジュール内で super を呼び出すと, スーパークラスの同名メソッドが呼び出される

オブジェクト指向 (14)

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

module Mod
  def foo
    puts 'Mod'
  end
end

class Cls1
  def foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  include Mod
end

Cls2.new.foo

以下, 解答.

Mod と表示

  • include しているモジュールのメソッドは, スーパークラスのメソッドよりも優先して実行される

オブジェクト指向 (15)

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

# コード
class Hoge
  [ x ]
end
Hoge.method1

# 実行結果
Hello, World.

以下, 解答.

# 解答 1
def self.method1
  puts 'Hello, World.'
end

# 解答 2
class << self
  def method1
    puts 'Hello, World.'
  end
end

以下, irb にて確認.

# 解答 1
irb(main):001:0> class Hoge
irb(main):002:1>   def self.method1
irb(main):003:2>     puts 'Hello, World.'
irb(main):004:2>   end
irb(main):005:1> end
=> :method1
irb(main):006:0> Hoge.method1
Hello, World.
=> nil
# 解答 2
irb(main):007:0> class Hoge
irb(main):008:1>   class << self
irb(main):009:2>     def method1
irb(main):010:3>       puts 'Hello, World.'
irb(main):011:3>     end
irb(main):012:2>   end
irb(main):013:1> end
=> :method1
irb(main):014:0> Hoge.method1
Hello, World.
=> nil

クラスメソッドの正しい定義方法.

# 定義方法 1
class Hoge
  def self.method1; end
end

# 定義方法 2
class Hoge
  class << self
    def method1; end
  end
end

フムフム.