Error code E0408
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.