Регресія Hash#reject в Ruby 2.1.1

Опублікував sorah 10-03-2014
Переклав: Andrii Furmanets

У Ruby 2.1.0 або раніше, метод reject у будь-якому класі, який успадковує Hash, повертає об’єкт свого власного класу. Але в Ruby 2.1.1 ця поведінка випадково змінилася, щоб завжди повертати звичайний об’єкт 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.1 не повинен включати такі зміни поведінки, оскільки з випуском Ruby 2.1.0 ми змінили нашу політику версіонування, тому Ruby 2.1.1 є випуском рівня патчу, і він не повинен ламати зворотну сумісність.

Ця регресія потенційно може вплинути на багато бібліотек, один такий випадок - це HashWithIndifferentAccess та OrderedHash Rails. Вони зламані: Проблема Rails #14188.

Ця поведінка буде повернена до поведінки 2.1.0 в Ruby 2.1.2, але очікується, що це буде поведінка за замовчуванням для Ruby 2.2.0: Функція #9223. Тому ми рекомендуємо виправити ваш код, щоб очікувати цю зміну поведінки.

Ця випадковість спричинена одним відсутнім комітом backport. Для більше деталей, див. http://blog.sorah.jp/2014/03/10/hash-reject-regression-in-ruby211.

Вибачте за будь-які незручності, та дякуємо за вашу підтримку.

Останні новини

Вийшов Ruby 4.0.0

Ми раді повідомити про випуск Ruby 4.0.0. Ruby 4.0 представляє “Ruby Box” та “ZJIT”, а також додає багато покращень.

Опублікував naruse 25-12-2025

Новий вигляд документації Ruby

Слідом за ре-дизайном ruby-lang.org, ми маємо більше новин, щоб відсвяткувати 30-річчя Ruby: docs.ruby-lang.org має повністю новий вигляд завдяки Aliki — новій темі за замовчуванням для...

Опублікував Stan Lo 23-12-2025

Більше новин...