Использование 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)
Другие вопросы по тегам