ジョギング
- 雨が降ったりやんだり, 強風だったりしたのでお休み
- 明日は走ろう
日課
- (腕立て x 50 + 腹筋 x 50) x 3
だるい
終日, 体がだるくてダラダラしていた.
Elixir のライブラリ
色々と思うところがあり, 最近, 日本の祝日・休日の情報に凝っている (笑 ので, これらの情報扱う Elixir のライブラリを書いて 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
- 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'
- 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
フムフム.