Régression de la méthode Hash#reject dans Ruby 2.1.1

Posté par sorah le 2014-03-10
Traduit par Geoffrey Roguelon

Dans les versions de Ruby 2.1.0 et inférieures, la méthode reject des classes héritées de Hash retourne un objet de cette sous-classe. Mais en Ruby 2.1.1, ce comportement a accidentellement changé pour retourner constamment un objet de la classe 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

(Pour être exact, les autres états comme les variables d’instance et autres ne sont pas copiés non plus.)

Ruby 2.1.1 n’aurait pas dû inclure ce changement de comportement car depuis la sortie de Ruby 2.1.0, nous avons changé la politique de versionnage, par conséquent, Ruby 2.1.1 est une version patch et ne doit contenir ce type de changement de comportement.

Cette régression peut affecter potentiellement plusieurs bibliothèques, parmi lesquels HashWithIndifferentAccess ou encore OrderedHash de Rails. Exemple de ticket Rails.

Ruby 2.1.2 rétablira le comportement Ruby 2.1.0 de la méthode Hash#reject. En revanche ce “défaut” deviendra le comportement par défaut de Ruby 2.2.0 : fonctionnalité #9223. Par conséquent, nous recommandons de corriger votre code en perspective de ce nouveau comportement.

Cet incident a été causé par un commit manquant. Pour plus de détails, consultez : http://blog.sorah.jp/2014/03/10/hash-reject-regression-in-ruby211.

Désolé pour la gêné occasionnée et merci pour votre soutien.

Actualité récente

Ruby 3.5.0 preview1 est disponible

Nous avons le plaisir d’annoncer la sortie de Ruby 3.5.0-preview1. Ruby 3.5 met à jour sa version Unicode vers 15.1.0, et plus encore.

Posté par naruse le 2025-04-18

Plus d'actualités...