Rust compiler complains about the following match being non-exhaustive. Is it a limit of Rust or do I miss something?
fn main() {
let x = 10;
match x {
1 => {},
y if y < 1 => {},
y if y > 1 => {}
}
}
Rust won't process if
expressions when validating exhaustiveness. Given that, you would either need to add a catch-all match that you mark as unreachable, e.g.
fn main() {
let x = 10;
match x {
1 => {},
y if y < 1 => {},
y if y > 1 => {}
_ => unreachable!()
}
}
or given your logic, the better option would be to not include the last if
at all, e.g.
fn main() {
let x = 10;
match x {
1 => {},
y if y < 1 => {},
y => {}
}
}
because it will only reach the last match
if the earlier one fails.
Related:
A cleaner but more verbose alternative is to use three-way comparison via cmp
:
use std::cmp::Ordering;
match x.cmp(&1) {
Ordering::Less => { /* ... */ },
Ordering::Equal => { /* ... */ },
Ordering::Greater => { /* ... */ },
}
(playground)
The exhaustiveness of the match is checked by the compiler. In particular, the cmp
method is unavailable for types that implement PartialOrd
but not Ord
, so the failure to handle incomparable values will be caught at compile time.
This is mentioned in the Comparing the Guess to the Secret Number section of the Programming a Guessing Game chapter in the book.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With