Ceci est un monkey patching :
class Float
def self.times(&block)
self.to_i.times { |i| yield(i) }
reste = self - self.to_i
yield(reste) if reste > 0.0
end
end
Maintenant, j'imagine que cela pourrait être utile parfois, mais imaginez si vous voyiez cela régulièrement.
def my_method(mon_nombre_special)
somme = 0
mon_nombre_special.times { |num| somme << certaine_valeur ** num }
somme
end
Et cela ne casse que de temps en temps lorsqu'il est appelé. Pour ceux qui prêtent attention, vous savez déjà pourquoi, mais imaginez que vous ne saviez pas que le type float avait une méthode de classe .times
et que vous assumez automatiquement que mon_nombre_special
est un entier. Chaque fois que le paramètre est un nombre entier, entier ou à virgule flottante, cela fonctionnera bien (des entiers entiers sont renvoyés sauf s'il y a un reste flottant). Mais passez un nombre avec quelque chose dans la partie décimale et cela cassera à coup sûr!
Imaginez simplement à quelle fréquence cela pourrait arriver avec vos gemmes, plugins Rails, et même par vos propres collègues dans vos projets. S'il y a un ou deux petits méthodes de ce type là-dedans et cela pourrait prendre du temps pour les trouver et les corriger.
Si vous vous demandez pourquoi cela casse, notez que somme
est un entier et un reste à virgule flottante pourrait être renvoyé; de plus, le signe exponentiel ne fonctionne que lorsque les types sont les mêmes. Donc, vous pourriez penser que c'est corrigé, car vous avez converti les deux nombres en flottants ... pour finalement trouver que la somme ne peut pas prendre le résultat en virgule flottante.