Выбрать главу

#[allow(...)], color models and enum

For pointers, a distinction needs to be made between destructuring and dereferencing as they are different concepts which are used differently from a language like C.

   • Dereferencing uses *

   • Destructuring uses &, ref, and ref mut

fn main() {

// Assign a reference of type `i32`. The `&` signifies there

// is a reference being assigned.

let reference = &4;

match reference {

// 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

The ref pattern

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),

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Structs

A match guard can be added to filter the arm.

fn main() {

let pair = (2, -2);

// TODO ^ Try different values for `pair`

println!("Tell me about {:?}", pair);

match pair {

(x, y) if x == y => println!("These are twins"),

// The ^ `if condition` part is a guard

(x, y) if x + y == 0 => println!("Antimatter, kaboom!"),

(x, _) if x % 2 == 1 => println!("The first one is odd"),

_ => println!("No correlation..."),

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX