我注意到我发现 Ruby 2.1.1 中的 **
(double-splat)运算符有一个非常令人惊讶的行为。
当在 **hash
之前使用键值对时,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]
数组始终保持不变。
我们是否假设 **
的有时破坏性行为是故意的,还是它看起来更像是一个错误?
无论哪种情况,描述 **
运算符如何工作的文档在哪里?
我也问过这个问题in the Ruby Forum .
更新
该错误已在 Ruby 2.1.3+ 中修复。
最佳答案
问题的答案似乎是:
这可能是一个错误,而不是故意的。
**
运算符的行为在 core library rdoc 中有非常简短的记录。 .
感谢几位评论者的建议,我已将错误发布到 Ruby trunk issue tracker .
更新:
错误已在 changeset r45724 中修复.那里的评论是“keyword splat should be non-destructive”,这使它成为一个权威的答案。
关于ruby - Double-splat 运算符破坏性地修改哈希值——这是 Ruby 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23282342/