rubocop / rubocop-jp

A place for RuboCop discussions in Japanese
55 stars 2 forks source link

Rangeの始点が終点より大きいコードを検出するCop #26

Open pocke opened 7 years ago

pocke commented 7 years ago

例えば、以下のようなコードはだいたいバグです。

range = 10..4
range.cover?(n) # nがどんな数値でもfalse

また、実際にバグを引き起こしていたコードとして、次のようなものがありました。

range = Time.zone.now...1.day.ago
range.cover?(foo.nantoka_at)

これもnantoka_atがどのような日付であれ、cover?は必ずfalseを返します。

このようなバグになりうるrangeの使い方を検出するCopがほしいです。

注意点

ただし、以下のようなrangeは始点の方が大きい数ですが普通に使用されます。

"abcde"[2..-1] # => cde
"abcde"[2..-2] # => cd

これに対応するには、終点が負の数になっていたら例外的に許可すればよい気がします。 もしかしたらまだ他にも例外ケースがあるかも知れません。

znz commented 7 years ago

終点が負の数でも、始点も負の数の時は始点の方が大きいのはバグっぽいかもしれません。

"abcde"[-2..-1] # => "de"
"abcde"[-2..-2] # => "d"
"abcde"[-2..-3] # => ""
"abcde"[-2..-4] # => ""
pocke commented 7 years ago

@znz ありがとうございます! このケースも考慮した方が良さそうですね。。