1

我想知道发生了什么。

当我执行以下操作时:

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>

如果我更改参数哈希,为什么这个 OpenStruct 会改变?有没有办法在不更改 OpenStruct 的情况下更改参数哈希?

谢谢!

4

2 回答 2

2

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

params = {first: new_struct.marshal_dump.clone}
于 2012-08-28T20:40:36.333 回答
1

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

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

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

于 2012-08-28T20:41:54.223 回答