【问题标题】:Using marshal_load with OpenStruct将 marshal_load 与 OpenStruct 一起使用
【发布时间】:2012-12-29 04:13:20
【问题描述】:

如何使用 OpenStruct 的 marshal_load 实用程序?它似乎没有按预期工作。

文档给出了this example,但它似乎不起作用。

require 'ostruct'

event = OpenStruct.new
hash = { 'time' => Time.now, 'title' => 'Birthday Party' }
event.marshal_load(hash)
event.title # => nil

如果不是这样,我如何将哈希加载到 OpenStruct 中(不使用构造函数)?

对于上下文:我正在从 YAML 文件加载哈希并将其加载到 OpenStruct 子类的现有实例中。

【问题讨论】:

  • +1,好问题。也许是时候发送错误报告了。

标签: ruby openstruct


【解决方案1】:

尝试使用基于符号的哈希。这对我有用。

#works.rb

hash = { :time => Time.now, :title => 'Birthday Party' }
event.marshal_load(hash)

【讨论】:

  • 有趣!它不是记录在案的,但我确认它有效。 YAML.load_file 返回字符串键,但我认为它们可以在加载之前转换为符号。
【解决方案2】:

marshal_load 方法的存在是为了提供对Marshal.load 的支持。

event = OpenStruct.new({ 'time' => Time.now, 'title' => 'Birthday Party' })
binary = Marshal.dump(event)
loaded = Marshal.load(binary) # the OpenStruct

以编程方式将哈希加载到结构中的最简单方法是使用发送:

event = OpenStruct.new
hash.each do |key, value|
  event.send("#{key}=", value)
end

【讨论】:

  • 我理解提供此方法的初衷,但它仍然无法按预期工作。发布的示例直接来自文档。话虽如此,我最终在我的 OpenStruct 子类中覆盖了 marshal_laod 方法并使用 send 来加载哈希。
猜你喜欢
  • 2011-03-15
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多