**
Ruby 2.1.1 の (ダブル スプラット) 演算子の非常に驚くべき動作に気付きました。
の前にキーと値のペアが使用されている**hash
場合、ハッシュは変更されません。ただし、キーと値のペアが の後にのみ使用される**hash
場合、ハッシュは永続的に変更されます。
h = { b: 2 }
{ a: 1, **h } # => { a: 1, b: 2 }
h # => { b: 2 }
{ a: 1, **h, c: 3 } # => { a: 1, b: 2, c: 3 }
h # => { b: 2 }
{ **h, c: 3 } # => { b: 2, c: 3 }
h # => { b: 2, c: 3 }
比較のために、*
配列に対する単一演算子の動作を考えてみましょう。
a = [2]
[1, *a] # => [1, 2]
a # => [2]
[1, *a, 3] # => [1, 2, 3]
a # => [2]
[*a, 3] # => [2, 3]
a # => [2]
配列は全体を通して変更されません。
の破壊的な動作**
は意図的なものだと思いますか、それともバグのように見えますか?
どちらの場合でも、**
オペレーターがどのように機能するかを説明しているドキュメントはどこにありますか?
Ruby Forumでもこの質問をしました。
アップデート
このバグは Ruby 2.1.3+ で修正されています。