Rust by Example | страница 32



>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

An enum is destructured similarly:

>// `allow` required to silence warnings because only

>// one variant is used.

>#[allow(dead_code)]

>enum Color {

>// These 3 are specified solely by their name.

>Red,

>Blue,

>Green,

>// These likewise tie `u32` tuples to different names: color models.

>RGB(u32, u32, u32),

>HSV(u32, u32, u32),

>HSL(u32, u32, u32),

>CMY(u32, u32, u32),

>CMYK(u32, u32, u32, u32),

>}

>fn main() {

>let color = Color::RGB(122, 17, 40);

>// TODO ^ Try different variants for `color`

>println!("What color is it?");

>// An `enum` can be destructured using a `match`.

>match color {

>Color::Red => println!("The color is Red!"),

>Color::Blue => println!("The color is Blue!"),

>Color::Green => println!("The color is Green!"),

>Color::RGB(r, g, b) =>

>println!("Red: {}, green: {}, and blue: {}!", r, g, b),

>Color::HSV(h, s, v) =>

>println!("Hue: {}, saturation: {}, value: {}!", h, s, v),

>Color::HSL(h, s, l) =>

>println!("Hue: {}, saturation: {}, lightness: {}!", h, s, l),

>Color::CMY(c, m, y) =>

>println!("Cyan: {}, magenta: {}, yellow: {}!", c, m, y),

>Color::CMYK(c, m, y, k) =>

>println!("Cyan: {}, magenta: {}, yellow: {}, key (black): {}!",

>c, m, y, k),

>// Don't need another arm because all variants have been examined

>}

>}

>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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 {