| #### 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: |
| |
| ``` |
| #![feature(move_ref_pattern)] |
| |
| 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. |
| |
| ``` |
| 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. |
| |
| ``` |
| #[derive(Clone, Copy)] |
| struct X { x: (), } |
| |
| let x = Some((X { x: () }, X { x: () })); |
| match x { |
| Some((y, ref z)) => {}, |
| None => panic!() |
| } |
| ``` |