-2
mainhash = { 'A' => [ 0,1,2,3,4  ]  , 'B' => [ 0 ,1,2 ,3 ]  } 

ahash = mainhash['A']

indval = ahash.shift  

ahash次のようになります

[1, 2, 3, 4]

そして次のようにmainhashなります

{"A"=>[1, 2, 3, 4], "B"=>[0, 1, 2, 3]}    

ahash ハッシュからいくつかの値をシフトして変数を操作しています。この操作を行うと、メインハッシュ値に影響します。なぜそれが起こっているのですか?

概念的な理解が欠けていますか?

4

3 に答える 3

3

見てArray#shift

self の最初の要素を削除して返します (他のすべての要素を 1 つ下にシフトします)。配列が空の場合は nil を返します。

mainhash = { 'A' => [ 0,1,2,3,4  ]  , 'B' => [ 0 ,1,2 ,3 ]  } 

ahash = mainhash['A']
p ahash.object_id # => 8577888
p mainhash['A'].object_id # => 8577888
p indval = ahash.shift # => 0

上記のように、同じ Array オブジェクトahashを参照すると、から削除される原因も変更されます。mainhash['A'][ 0,1,2,3,4]ahash#shift0ahash0mainhash['A']

あなたのハッシュは以下のようになると言った:

mainhash
# => {"A"=>[1, 2, 3, 4], "B"=>[0, 1, 2, 3]}

すべての操作は正当であり、上記のリンクに記載されているとおりに行われました。

メインハッシュへの影響を回避するにはどうすればよいですか

@Marek Lipkaが言ったように:

dup メソッドを使用する必要があります: ahash = mainhash['A'].dup

mainhash = { 'A' => [ 0,1,2,3,4  ]  , 'B' => [ 0 ,1,2 ,3 ]  } 

ahash = mainhash['A'].dup
ahash.object_id # => 8577516
mainhash['A'].object_id # => 8577600
indval = ahash.shift # => 0
ahash # => [1, 2, 3, 4]
mainhash['A'] # => [0, 1, 2, 3, 4]
于 2013-07-02T09:45:37.837 に答える