Это исправление обезьяны:
class Float
def self.times(&block)
self.to_i.times { |i| yield(i) }
remainder = self - self.to_i
yield(remainder) if remainder > 0.0
end
end
Теперь я представляю, что иногда это может быть полезно, но представьте, если вы видели рутину.
def my_method(my_special_number)
sum = 0
my_special_number.times { |num| sum << some_val ** num }
sum
end
И он ломается только , иногда , когда его вызывают. Тем, кто обращает внимание, вы уже знаете почему, но представьте, что вы не знали о типе с плавающей точкой, имеющем .times
class-метод, и автоматически предположили, что my_special_number
является целым числом. Каждый раз, когда параметр представляет собой целое число, целое число или число с плавающей запятой, он будет работать нормально (целые числа передаются обратно, кроме случаев, когда есть остаток с плавающей запятой). Но передайте число с чем-либо в десятичной области, и оно наверняка сломается!
Только представьте, как часто это может происходить с вашими гемами, плагинами Rails и даже вашими коллегами по проектам. Если есть один или два небольших метода, подобных этому, и может потребоваться некоторое время, чтобы найти и исправить.
Если вам интересно, почему он ломается, обратите внимание, что sum
является целым числом, а остаток с плавающей запятой может быть передан обратно; Кроме того, экспоненциальный знак работает только при одинаковых типах. Таким образом, вы можете подумать, что это исправлено, потому что вы преобразовали надоедливые числа в числа с плавающей запятой ... только чтобы обнаружить, что сумма не может принять результат с плавающей запятой.