【问题标题】:Why do OpenStruct values change when a hash with its dumped values change?为什么当带有转储值的散列发生变化时,OpenStruct 值会发生变化?
【发布时间】:2012-08-28 20:35:30
【问题描述】:

我想知道发生了什么。

当我执行以下操作时:

new_struct = OpenStruct.new()
new_struct.color = 'Red'
new_struct.number = 4

这会导致:

#<OpenStruct color="Red", number=4>

如果我随后创建并更改一些参数:

params = { first: new_struct.marshal_dump }

params[:first][:color] = 'Orange'

这导致 OpenStruct 更改为:

#<OpenStruct color="Orange", number=4>

如果我更改了 params 哈希,为什么这个 OpenStruct 会发生变化?有没有办法在不更改 OpenStruct 的情况下更改 params 哈希?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby openstruct


    【解决方案1】:

    这并不奇怪,marshal_dump 返回带有 OpenStruct 对象命名空间的哈希,它像任何其他哈希一样是可变的。如果你想防止这种行为,克隆它:

    params = {first: new_struct.marshal_dump.clone}
    

    【讨论】:

    • 谢谢,我想一定有什么原因。 OpenStruct 是我数据库中的列之一,令我惊讶的是它正在发生变化。
    【解决方案2】:

    来自 ruby​​-doc 上 OpenStruct 的 marshal_dump() 条目:

    提供编组支持以供 Marshal 库使用。 返回包含 函数定义为键和分配给它们的值。

    您从marshal_dump() 获得的哈希实际上是 OpenStruct 的底层表示,因此哈希的任何更改都会反映在对象中。你总是可以克隆哈希来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2015-09-14
      • 2013-07-30
      • 2019-12-23
      相关资源
      最近更新 更多