stdlib/marshal_extended_values_no_parens.rb

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

module Audited
  def audited? = true
end

# A value such as an Array or a String answers `is_a?` for the modules it
# was extended with, and keeps them through Marshal.
readings = [Object.new].extend Audited
p readings.is_a? Audited
dumped = Marshal.dump readings
loaded = Marshal.load dumped
p loaded.is_a? Audited
p loaded[0].is_a? Audited
label = "meter".dup.extend Audited
dumped = Marshal.dump label
p Marshal.load(dumped).audited?

# A user-marshaled object is extended before `marshal_load` runs.
class Snapshot
  attr_reader :saw_module
  def marshal_dump = :data
  def marshal_load _data
    @saw_module = respond_to? :audited?
  end
end
snapshot = Snapshot.new.extend Audited
dumped = Marshal.dump snapshot
copied = Marshal.load dumped
p copied.saw_module

Output:

true
true
false
true
false