我想知道发生了什么。
当我执行以下操作时:
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哈希?
谢谢!
答案 0 :(得分:2)
并不令人惊讶,marshal_dump
返回带有OpenStruct对象命名空间的哈希值,这个哈希值与任何其他哈希值一样可变。如果要阻止此行为,请将其克隆:
params = {first: new_struct.marshal_dump.clone}
答案 1 :(得分:1)
来自ruby-doc上的OpenStruct的marshal_dump()条目:
提供Marshal库使用的编组支持。 返回包含的底层Hash表 定义为键的函数和分配给它们的值。
从marshal_dump()
获得的哈希实际上是OpenStruct的底层表示,因此哈希中的任何更改都将反映在对象中。你总是可以克隆哈希来解决这个问题。