为什么当具有转储值的哈希发生变化时,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哈希?

谢谢!

marshal_dump返回带有OpenStruct对象名称空间的哈希,这与其他哈希一样是可变的。如果你想防止这种行为,克隆它:

params = {first: new_struct.marshal_dump.clone}

来自ruby文档上OpenStruct的marshall_dump()条目:

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

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

相关内容

  • 没有找到相关文章

最新更新