微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

双splat操作符破坏性修改哈希 – 这是一个Ruby错误?

我发现在 Ruby 2.1.1中的**(double-splat)操作符,我觉得这是一个非常令人惊讶的行为.

当在一个**散列之前使用键值对时,散列保持未修改;然而,当键值对仅在**散列之后使用时,哈希将被永久修改.

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.

UPDATE

Ruby 2.1.3中修复了错误.

解决方法

这个问题的答案似乎是:

>这可能是一个错误,而不是有意的.
>在core library rdoc中,**操作符的行为非常简短.

感谢几位评论者的建议,我把错误发布到了Ruby trunk issue tracker.

更新:

错误changeset r45724修复.该评论是“关键字splat应该是非破坏性的”,这使得这是一个权威的答案.

原文地址:https://www.jb51.cc/ruby/265956.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐