Регресія 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.2.10
Вийшов Ruby 3.2.10.
Опублікував hsbt 14-01-2026
Вийшов Ruby 4.0.1
Вийшов Ruby 4.0.1.
Опублікував k0kubun 13-01-2026
Вийшов 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