当具有转储值的哈希值发生变化时,为什么OpenStruct值会发生变化?

时间:2012-08-28 20:35:30

标签: ruby-on-rails ruby openstruct

我想知道发生了什么。

当我执行以下操作时:

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哈希?

谢谢!

2 个答案:

答案 0 :(得分:2)

并不令人惊讶,marshal_dump返回带有OpenStruct对象命名空间的哈希值,这个哈希值与任何其他哈希值一样可变。如果要阻止此行为,请将其克隆:

params = {first: new_struct.marshal_dump.clone}

答案 1 :(得分:1)

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

  

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

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