これはモンキーパッチです:
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
そして、呼び出されたときにたまにしか壊れません。注意を払っている人には、すでに理由はわかっていますが、float 型に class-method があることを知らず、それが整数.times
であると自動的に仮定したと想像してください。my_special_number
パラメータが整数、整数、または浮動小数の場合はいつでも、正常に機能します (浮動小数点の剰余がある場合を除き、整数全体が返されます)。しかし、小数領域に何かを含む数値を渡すと、確実に壊れます!
あなたの gem、Rails プラグイン、さらにはプロジェクトの同僚によってさえ、これがどのくらいの頻度で発生するか想像してみてください。このような小さなメソッドが 1 つまたは 2 つあると、見つけて修正するのに時間がかかる場合があります。
なぜ壊れるのか疑問に思う場合sum
は、 が整数であり、浮動小数点の剰余が返される可能性があることに注意してください。さらに、指数記号は型が同じ場合にのみ機能します。面倒な数値を浮動小数点数に変換したため、修正されたと思うかもしれません...合計が浮動小数点の結果を取得できないことがわかりました。