stdlib/marshal_core_values_no_parens.rb

tests/_examples/stdlib/marshal_core_values_no_parens.rb in the metorex repository.

# Marshal writes exceptions, ranges, times and wide numbers the way Ruby
# does, and reads them back whole.
failure = RuntimeError.new("disk full")
failure.set_backtrace ["store.rb:12"]
failure.instance_variable_set :@retries, 3
p Marshal.dump(failure)

begin
  begin
    raise ArgumentError, "bad size"
  rescue ArgumentError
    raise RuntimeError, "write failed"
  end
rescue RuntimeError => raised
  back = Marshal.load(Marshal.dump(raised))
  p [back.class, back.message, back.cause.class, back.cause.message]
end

p Marshal.dump(1..2)
p Marshal.dump(1...2)
p Marshal.load(Marshal.dump(3...9))

moment = Time.utc(2012, 1, 1)
p Marshal.dump(moment)
p Marshal.load(Marshal.dump(moment)) == moment

wide = 2**64
p Marshal.dump([wide, wide])

p Exception.allocate.message

Output:

"\x04\bo:\x11RuntimeError\b:\tmesgI\"\x0Edisk full\x06:\x06ET:\abt[\x06I\"\x10store.rb:12\x06;\aT:\r@retriesi\b"
[RuntimeError, "write failed", ArgumentError, "bad size"]
"\x04\bo:\nRange\b:\texclF:\nbegini\x06:\bendi\a"
"\x04\bo:\nRange\b:\texclT:\nbegini\x06:\bendi\a"
3...9
"\x04\bIu:\tTime\r \x00\x1C\xC0\x00\x00\x00\x00\x06:\tzoneI\"\bUTC\x06:\x06EF"
true
"\x04\b[\al+\n\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00@\x06"
"Exception"