Использование marshal_load с OpenStruct
Как мне использовать утилиту OpenStruct marshal_load? Кажется, он не работает как задумано.
Документы приводят этот пример, но он не работает.
require 'ostruct'
event = OpenStruct.new
hash = { 'time' => Time.now, 'title' => 'Birthday Party' }
event.marshal_load(hash)
event.title # => nil
Если не так, как мне загрузить хеш в OpenStruct (без использования конструктора)?
Для контекста: я загружаю хеш из файла YAML и загружаю его в существующий экземпляр подкласса OpenStruct.
2 ответа
Решение
marshal_load
метод существует, чтобы обеспечить поддержку Marshal.load
,
event = OpenStruct.new({ 'time' => Time.now, 'title' => 'Birthday Party' })
binary = Marshal.dump(event)
loaded = Marshal.load(binary) # the OpenStruct
Самый простой способ программно загрузить хеш в структуру - использовать send:
event = OpenStruct.new
hash.each do |key, value|
event.send("#{key}=", value)
end
Попробуйте использовать символьный хэш. Это сработало для меня.
#works.rb
hash = { :time => Time.now, :title => 'Birthday Party' }
event.marshal_load(hash)