Error code E0009
Note: this error code is no longer emitted by the compiler.
In a pattern, all values that don't implement the Copy
trait have to be bound
the same way. The goal here is to avoid binding simultaneously by-move and
by-ref.
This limitation may be removed in a future version of Rust.
Erroneous code example:
#![allow(unused)] #![feature(move_ref_pattern)] fn main() { struct X { x: (), } let x = Some((X { x: () }, X { x: () })); match x { Some((y, ref z)) => {}, // error: cannot bind by-move and by-ref in the // same pattern None => panic!() } }
You have two solutions:
Solution #1: Bind the pattern's values the same way.
#![allow(unused)] fn main() { struct X { x: (), } let x = Some((X { x: () }, X { x: () })); match x { Some((ref y, ref z)) => {}, // or Some((y, z)) => {} None => panic!() } }
Solution #2: Implement the Copy
trait for the X
structure.
However, please keep in mind that the first solution should be preferred.
#![allow(unused)] fn main() { #[derive(Clone, Copy)] struct X { x: (), } let x = Some((X { x: () }, X { x: () })); match x { Some((y, ref z)) => {}, None => panic!() } }