gpt4 book ai didi

ruby - Double-splat 运算符破坏性地修改哈希值——这是 Ruby 错误吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:44 28 4
gpt4 key购买 nike

我注意到我发现 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+ 中修复。

最佳答案

问题的答案似乎是:

  1. 这可能是一个错误,而不是故意的。

  2. ** 运算符的行为在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com