ようへいの日々精進XP

よかろうもん

2018 年 04 月 14 日(土)

ジョギング

  • 雨が降ったりやんだり, 強風だったりしたのでお休み
  • 明日は走ろう

日課

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

だるい

終日, 体がだるくてダラダラしていた.

Elixir のライブラリ

色々と思うところがあり, 最近, 日本の祝日・休日の情報に凝っている (笑 ので, これらの情報扱う Elixir のライブラリを書いて hex.pm に公開してみた.

hex.pm

Elixir に限らず, Travis CI の勉強にもなって楽しかった.

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

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

Q40. オブジェクト指向

以下の実行結果になるように, [ 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 での実行例.

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

クラスメソッドの正しい実装方法は以下の通り.

class Foo
  def self.method1
    # メソッドの処理
  end
end

# 特異メソッド方式
class Bar
  def Bar.method1
    # メソッドの処理
  end
end

# 特異クラス方式
class Baz
  class << self
    def method1
      # メソッドの処理
    end
  end
end

# モジュールのインスタンスメソッドを extend すればクラスメソッドになる
Module Qux
  def method1
    # メソッドの処理
  end
end

class Quux
  extend Qux
end

ドキュメントを確認すること.

Q41. 標準添付ライブラリ

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

d1 = Time.new
d2 = Time.new
p (d2 - d1).class
  1. Float

以下, irb による実行例.

irb(main):015:0> d1 = Time.new
=> 2018-04-11 06:31:03 +0900
irb(main):016:0> d2 = Time.new
=> 2018-04-11 06:31:03 +0900
irb(main):017:0> p (d2 - d1).class
Float
=> Float

以下, 解説より抜粋.

  • Time 同士の演算結果は Float 型になる

Q42. 組み込みライブラリ

以下のコードを実行した時に, 正しい出力結果を選べ.

f = Fiber.new {
  print 'A'
  Fiber.yield 'B'
  print 'C'
}
print 'D'
print f.resume
print 'E'
  1. DABE

以下, irb による実行例.

irb(main):001:0> f = Fiber.new {
irb(main):002:1*   print 'A'
irb(main):003:1>   Fiber.yield 'B'
irb(main):004:1>   print 'C'
irb(main):005:1> }
=> #<Fiber:0x0055dcc513d8d0>
irb(main):006:0> print 'D'
D=> nil
irb(main):007:0> print f.resume
AB=> nil
irb(main):008:0> print 'E'
E=> nil

分かりづらいけど, D => AB => E の順番で出力されている.

以下, 解説より抜粋.

  • Fiber ブロック内の f.resume が呼び出された時に評価され, Fiber.yield まで実行する
  • Fiber.yield が呼ばれると, 引数 B と共に元のコンテキストに処理を戻す

出題では, f.resume が 1 回しか呼ばれていない為, print 'C' は実行されないが, 以下のように, 改めて f.resume を呼び出すと, C が出力される.

irb(main):001:0> f = Fiber.new {
irb(main):002:1*   print 'A'
irb(main):003:1>   Fiber.yield 'B'
irb(main):004:1>   print 'C'
irb(main):005:1> }
=> #<Fiber:0x00564b604f5860>
irb(main):006:0> print 'D'
D=> nil
irb(main):007:0> print f.resume
AB=> nil
irb(main):008:0> print 'E'
E=> nil
irb(main):009:0> print f.resume
C=> nil

フムフム.