我想知道发生了什么。
当我执行以下操作时:
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哈希?
谢谢!
marshal_dump
返回带有OpenStruct对象名称空间的哈希,这与其他哈希一样是可变的。如果你想防止这种行为,克隆它:
params = {first: new_struct.marshal_dump.clone}
来自ruby文档上OpenStruct的marshall_dump()条目:
提供封送支持以供Marshal库使用。返回包含定义为键的函数和分配给它们的值。
从marshal_dump()
获得的哈希实际上是OpenStruct的底层表示,因此哈希中的任何更改都将反映在对象中。你可以随时克隆哈希来绕过这个问题。