Регресія 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 3.3.12
Вийшов Ruby 3.3.12.
Опублікував hsbt 16-07-2026
Вийшов Ruby 4.0.6
Вийшов Ruby 4.0.6.
Опублікував k0kubun 14-07-2026
Вийшов Ruby 3.4.10
Вийшов Ruby 3.4.10.
Опублікував nagachika 30-06-2026
Вийшов Ruby 4.0.5
Вийшов Ruby 4.0.5.
Опублікував k0kubun 20-05-2026