关于 Ruby 2.1.1 中包含的 Hash#reject 不正确的情况

sorah 发表于 2014-03-10
翻译: ywjno

直到 Ruby 2.1.0 为止,继承了 Hash 的类的 reject 方法,将会返回那个继承的类的对象。 但是在 Ruby 2.1.1 中,不小心出现了错误的变动,变成了即使在继承了 Hash 的类的情况下,也必定会返回 Hash 类的对象。

class SubHash < Hash
end

p Hash.new.reject { }.class
#=> 2.1.0: Hash, 2.1.1: Hash
p SubHash.new.reject { }.class
#=> 2.1.0: SubHash, 2.1.1: Hash

(正确的说,实例变量等其他的属性也都没有被复制过来)

因为从 Ruby 2.1.0 开始实施的版本变动方针,Ruby 2.1.1 是属于补丁级别的发布。而补丁级别的发布应该是保持向下兼容,因此在 Ruby 2.1.1 中不应该加入这个变动。

这个错误的变动可能对某些库造成了影响。其中一个被发现的事例是 Rails 中的 HashWithIndifferentAccessOrderedHashRails issue #14188

这个变动打算将在 Ruby 2.1.2 中回到原来的状态。但是在这个 Feature #9223 的讨论中,这个修正将预计在 Ruby 2.2.0 中导入。 我们假设您的代码将按照这个变动进行修改。

此外,这个错误是源于漏了一个兼容性的提交。包括对策等详细的情况请参照这篇文章:http://diary.sorah.jp/2014/02/28/ruby211-hash-reject

给您带来的不便我们深感抱歉。

最新消息

Ruby 4.0.0 已发布

我们很高兴地宣布 Ruby 4.0.0 已发布。 Ruby 4.0 引入了 Ruby::Box 和 “ZJIT”,以及若干改进。

naruse 发表于 2025-12-25

全新的 Ruby 文档界面

继 重新设计 ruby-lang.org之后, 我们还有更多消息来庆祝 Ruby 诞生 30 周年:docs.ruby-lang.org 采用了全新的、RDoc 的 Aliki 默认主题。

Stan Lo 发表于 2025-12-23

重新设计我们的网站标识

我们激动地宣布网站已经全面改版。此次更新的设计方案由 Taeko Akatsuka (赤塚妙子) 创作。

Hiroshi SHIBATA 发表于 2025-12-22

Ruby 4.0.0 preview3 已发布

我们很高兴地宣布 Ruby 4.0.0-preview3 已发布。 Ruby 4.0 引入了 Ruby::Box 和 “ZJIT”,以及若干改进。

naruse 发表于 2025-12-18

更多新闻...