An "or" pattern was used where the variable bindings are not consistently bound across patterns.
Erroneous code example:
#![allow(unused)]
fn main() {
match x {
Some(y) | None => { /* use y */ } // error: variable `y` from pattern #1 is
// not bound in pattern #2
_ => ()
}
} Here, y is bound to the contents of the Some and can be used within the block corresponding to the match arm. However, in case x is None, we have not specified what y is, and the block will use a nonexistent variable.
To fix this error, either split into multiple match arms:
#![allow(unused)]
fn main() {
let x = Some(1);
match x {
Some(y) => { /* use y */ }
None => { /* ... */ }
}
} or, bind the variable to a field of the same type in all sub-patterns of the or pattern:
#![allow(unused)]
fn main() {
let x = (0, 2);
match x {
(0, y) | (y, 0) => { /* use y */}
_ => {}
}
} In this example, if x matches the pattern (0, _), the second field is set to y. If it matches (_, 0), the first field is set to y; so in all cases y is set to some value.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/error_codes/E0408.html