Quick range question

Do all these compile to the same code, and if not, which one is faster?

if (x..y).includes? a

if (x..y).covers? a

if x <= a <= y

They’re the same.

#includes? is one less call, but this is likely optimised out during a build. It’s one of the few (/only?) methods in stdlib with dual names.

1 Like

Interesting.

I wonder if this covers? “alias” was introduced before “we discourage aliases in Crystal” altitude?

I’ve tried these in Compiler Explorer where Crystal support was added by @HertzDevil recently.

Add --release flag in Compiler Options:

(1..3).includes? 2

(1..3).covers? 2

1 <= 2 <= 3

And they seem to produce exactly the same code.

Without --release flag they generate different code though, so covers? would be 1 more method call and plain conditions would be no method calls at all.

2 Likes

Thanks all. In Ruby cover? and include? are a little bit different.