ようへいの日々精進XP

よかろうもん

2018 年 03 月 15 日(木)

ジョギング

  • 香椎浜 x 2 周
  • かるーく
  • 左ひざの内側あたりがずっと痛いんだが, 新しい靴で走り始めると痛くなっている気がする

日課

  • お休み

裕美生誕祭

  • 奥さんの 42 回目の誕生日で, 少しだけサプライズを用意して祝った
  • いつも, 寂しい思いをさせてしまっているけど, これからも二人で仲良く過ごしていきたい
  • おめでとう, 色々と悩みの続く毎日だけど, 体だけには気をつけて
  • 今年, 一年が素敵な年になりますように

今日のるびぃ ~ Ruby技術者認定試験【Gold】模擬問題を解いてみる (14) ~

Q.59 組み込みモジュール (Marshal)

Marshal モジュールの説明として正しいものを選択してください.

IOオブジェクトや特異メソッドを持つオブジェクトはシリアライズすることができない

ドキュメントより抜粋.

  • Ruby オブジェクトをファイル(または文字列)に書き出したり, 読み戻したりする機能を提供するモジュール
  • 大部分のクラスのインスタンスを書き出す事ができるが、書き出しの不可能なクラスも存在する (以下, 参照)

以下, 書き出し不可能なクラス.

  • 名前のついてない Class/Module オブジェクト
    • この場合は, 例外 ArgumentError が発生する
  • システムがオブジェクトの状態を保持するもの
    • 具体的には Dir, File::Stat, IO とそのサブクラス File, Socket など
  • MatchData, Data, Method, UnboundMethod, Proc, Thread, ThreadGroup, Continuationインスタンス
  • 特異メソッドを定義したオブジェクト

以下, 実行例.

# 書き出せるパターン
[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> f = Foo.new
=> #<Foo:0x00005610e93b7dd8>
[3] pry(main)> Marshal.dump(f)
=> "\x04\bo:\bFoo\x00"
[4] pry(main)> Marshal.load("\x04\bo:\bFoo\x00")
=> #<Foo:0x00005610e92d53e8>

# 書き出せないパターン
[1] pry(main)> f = File.open('index.html')
=> #<File:index.html>
[2] pry(main)> Marshal.dump(f)
TypeError: can't dump File
from (pry):2:in `dump'
[3] pry(main)

Q.60 ライブラリ

標準添付ライブラリによって提供されていないクラスを選択してください.

Swap

標準添付ライブラリによって提供されているクラス.

  • TCPSocket
[3] pry(main)> require "socket"
=> true
[4] pry(main)> TCPSocket.ancestors
=> [TCPSocket, IPSocket, BasicSocket, IO, File::Constants, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject]
  • Thread
[6] pry(main)> Thread.ancestors
=> [Thread, Object, PP::ObjectMixin, Kernel, BasicObject]
  • Test::Unit

以下, 実行例. 事前に test-unitgem install しておく必要がある.

# テストされるコード
$ cat foo.rb 
def foo
  "foo"
end

def bar
  "bar"
end

# テストコード
$ cat test_foo.rb 
require 'test/unit'
require './foo'

class Test_Foo < Test::Unit::TestCase
  def test_foo
    assert_equal("foo", foo)
  end
  def test_bar
    assert_equal("bar", bar)
  end
end

# テスト実行
$ bundle exec ruby test_foo.rb 
Loaded suite test_foo
Started
..
Finished in 0.000554063 seconds.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3609.70 tests/s, 3609.70 assertions/s

ふむふむ.