Rust by Example | страница 33
>// If `reference` is pattern matched against `&val`, it results
>// in a comparison like:
>// `&i32`
>// `&val`
>// ^ We see that if the matching `&`s are dropped, then the `i32`
>// should be assigned to `val`.
>&val => println!("Got a value via destructuring: {:?}", val),
>}
>// To avoid the `&`, you dereference before matching.
>match *reference {
>val => println!("Got a value via dereferencing: {:?}", val),
>}
>// What if you don't start with a reference? `reference` was a `&`
>// because the right side was already a reference. This is not
>// a reference because the right side is not one.
>let _not_a_reference = 3;
>// Rust provides `ref` for exactly this purpose. It modifies the
>// assignment so that a reference is created for the element; this
>// reference is assigned.
>let ref _is_a_reference = 3;
>// Accordingly, by defining 2 values without references, references
>// can be retrieved via `ref` and `ref mut`.
>let value = 5;
>let mut mut_value = 6;
>// Use `ref` keyword to create a reference.
>match value {
>ref r => println!("Got a reference to a value: {:?}", r),
>}
>// Use `ref mut` similarly.
>match mut_value {
>ref mut m => {
>// Got a reference. Gotta dereference it before we can
>// add anything to it.
>*m += 10;
>println!("We added 10. `mut_value`: {:?}", m);
>},
>}
>}
>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Similarly, a struct can be destructured as shown:
>fn main() {
>struct Foo {
>x: (u32, u32),
>y: u32,
>}
>// Try changing the values in the struct to see what happens
>let foo = Foo { x: (1, 2), y: 3 };
>match foo {
>Foo { x: (1, b), y } => println!("First of x is 1, b = {}, y = {} ", b, y),
>// you can destructure structs and rename the variables,
>// the order is not important
>Foo { y: 2, x: i } => println!("y is 2, i = {:?}", i),
>// and you can also ignore some variables:
>Foo { y, .. } => println!("y = {}, we don't care about x", y),
>// this will give an error: pattern does not mention field `x`
>//Foo { y } => println!("y = {}", y),
>}
>}
>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה