我注意到我发现**
Ruby 2.1.1 中的 (double-splat) 运算符有一个非常令人惊讶的行为。
当在 a 之前使用键值对时**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 论坛上问过这个问题。
更新
该错误已在 Ruby 2.1.3+ 中修复。