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

标签 ruby hash syntax splat double-splat

我注意到我发现 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/

相关文章:

Ruby 轻松访问类变量

ruby-on-rails - 当我创建新用户时设计 current_user 返回 nil,Rails 3.2

php - Symfony2 创建自己的编码器来存储密码

php - 无法使用 mysqli (PHP) 在表中插入行

c++ - 为什么合并的上限和下限比较总是评估为真?

ruby-on-rails - 使用 BCrypt 更新密码

mysql - attr_encrypted 和加密由 date_select 表单助手生成的日期

c++ - 为什么 C++ POD 结构没有默认散列?

algorithm - 如果我对唯一的字符串使用简单的替换算法,输出是否总是唯一的?

javascript - javascript中点符号和括号符号之间的区别