关于 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 中的 HashWithIndifferentAccess 与 OrderedHash:Rails issue #14188
这个变动打算将在 Ruby 2.1.2 中回到原来的状态。但是在这个 Feature #9223 的讨论中,这个修正将预计在 Ruby 2.2.0 中导入。 我们假设您的代码将按照这个变动进行修改。
此外,这个错误是源于漏了一个兼容性的提交。包括对策等详细的情况请参照这篇文章:http://diary.sorah.jp/2014/02/28/ruby211-hash-reject
给您带来的不便我们深感抱歉。
最新消息
Ruby 3.3.12 已发布
Ruby 3.3.12 已发布。
由 hsbt 发表于 2026-07-16
Ruby 4.0.6 已发布
Ruby 4.0.6 已发布。
由 k0kubun 发表于 2026-07-14
Ruby 3.4.10 已发布
Ruby 3.4.10 已发布。
由 nagachika 发表于 2026-06-30
Ruby 4.0.5 已发布
Ruby 4.0.5 已发布。
由 k0kubun 发表于 2026-05-20