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>

params ハッシュを変更すると、この OpenStruct が変更されるのはなぜですか? OpenStruct を変更せずに params ハッシュを変更する方法はありますか?

ありがとう!

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 に答える