Lỗi hồi quy của Hash#reject trong Ruby 2.1.1
Đăng bởi sorah vào 10 Mar 2014
Trong Ruby 2.1.0 trở về trước, phương thức reject trong bất kỳ lớp nào
kế thừa Hash trả về một đối tượng thuộc lớp của chính nó.
Nhưng trong Ruby 2.1.1, hành vi này đã vô tình thay đổi, luôn trả về
một đối tượng Hash thuần, không phải lớp kế thừa.
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(Chính xác hơn, các trạng thái bổ sung như biến instance, v.v. cũng không được sao chép.)
Ruby 2.1.1 không nên bao gồm các thay đổi hành vi như vậy, bởi vì với việc phát hành Ruby 2.1.0 chúng tôi đã thay đổi chính sách đánh số phiên bản, vì vậy Ruby 2.1.1 là bản phát hành cấp patch và không nên phá vỡ tương thích ngược.
Lỗi hồi quy này có thể ảnh hưởng đến nhiều thư viện, một trường hợp như vậy là
HashWithIndifferentAccess và OrderedHash của Rails. Chúng bị hỏng:
Rails’ issue #14188.
Hành vi này sẽ được hoàn nguyên về hành vi của 2.1.0 trong Ruby 2.1.2, nhưng dự kiến sẽ là hành vi mặc định cho Ruby 2.2.0: Feature #9223. Vì vậy chúng tôi khuyến nghị bạn sửa mã nguồn để chuẩn bị cho thay đổi hành vi này.
Sự cố này được gây ra bởi một commit backport bị thiếu. Để biết thêm chi tiết, xem http://blog.sorah.jp/2014/03/10/hash-reject-regression-in-ruby211.
Xin lỗi vì sự bất tiện, và cảm ơn sự hỗ trợ của bạn.
Tin mới nhất
Phát hành Ruby 3.2.10
Ruby 3.2.10 đã được phát hành.
Đăng bởi hsbt vào 14 Jan 2026
Phát hành Ruby 4.0.1
Ruby 4.0.1 đã được phát hành.
Đăng bởi k0kubun vào 13 Jan 2026
Phát hành Ruby 4.0.0
Chúng tôi vui mừng thông báo phát hành Ruby 4.0.0. Ruby 4.0 giới thiệu “Ruby Box” và “ZJIT”, cùng nhiều cải tiến khác.
Đăng bởi naruse vào 25 Dec 2025
Diện mạo mới cho tài liệu Ruby
Tiếp theo việc thiết kế lại ruby-lang.org, chúng tôi có thêm tin vui để kỷ niệm 30 năm Ruby: docs.ruby-lang.org có diện mạo hoàn toàn...
Đăng bởi Stan Lo vào 23 Dec 2025