ようへいの日々精進XP

よかろうもん

2018 年 03 月 26 日(月)

ジョギング

  • 香椎浜 x 2 周
  • 引き続き, 左足の足底と右膝内側に痛み

日課

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

インフラ構築

  • 久しぶりにインフラ構築をコツコツとやっている
  • 根を詰め過ぎたのか午後からずーっと頭痛が続いて辛かった

夕飯

  • 俺達の「よしもと」
  • 店員の愛想の良いお兄さんが今日で最後の出勤ということで, お花を贈るなど

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

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

Q25. 組み込みライブラリ

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

f = Fiber.new {
  [ x ] 'foo'
}

puts f.resume

実行結果.

"foo"

[ x ] には, Fiber.yield が入るはず...なので, irb で実行してみる.

irb(main):001:0> f = Fiber.new {
irb(main):002:1*   Fiber.yield 'foo'
irb(main):003:1> }
=> #<Fiber:0x005631ab8dada0>
irb(main):004:0> 
irb(main):005:0* puts f.resume
foo
=> nil

以下, 解説より抜粋.

  • Fiber.yield は現在のファイバの親にコンテキストを切り替える
  • f.resume は, Fiber.yield で与えた引数の foo を返す

以下, ドキュメントからの抜粋メモ.

  • Fiber とはノンプリエンプティブな軽量スレッドを提供する
  • Thread と違いユーザレベルスレッドとして実装されている
  • Thread クラスが表すスレッドと違い, 明示的に指定しない限りファイバーのコンテキストは切り替わらない

できることは...

  • Fiber#resume により子へコンテキストを切り替える
  • Fiber.yield により親へコンテキストを切り替える

の二通りで, この親子関係は一時的なものであり親ファイバーへコンテキストを切り替えた時点で解消される.

Q26. 標準添付ライブラリ

以下のコードを実行したらどうなるか. テストされるクラスファイル foo.rb は存在している仮定する.

require 'test/unit'
require 'foo'

class TC_Foo < Test::Unit::TestCase
  def foo_test
    # test codes
  end
end

このコードを実行すると, foo_test が規約に則っていないので実行されない.

以下, 解説より抜粋.

  • Test::Unit のテストメソッド名は test_ で開始する

以下が正しい.

require 'test/unit'
require 'foo'

class TC_Foo < Test::Unit::TestCase
  def test_foo
    # test codes
  end
end

フムフム