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



>// `enums` can be cast as integers.

>println!("zero is {}", Number::Zero as i32);

>println!("one is {}", Number::One as i32);

>println!("roses are #{:06x}", Color::Red as i32);

>println!("violets are #{:06x}", Color::Blue as i32);

>}

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

>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

A common use for enums is to create a linked-list:

>use crate::List::*;

>enum List {

>// Cons: Tuple struct that wraps an element and a pointer to the next node

>Cons(u32, Box),

>// Nil: A node that signifies the end of the linked list

>Nil,

>}

>// Methods can be attached to an enum

>impl List {

>// Create an empty list

>fn new() -> List {

>// `Nil` has type `List`

>Nil

>}

>// Consume a list, and return the same list with a new element at its front

>fn prepend(self, elem: u32) -> List {

>// `Cons` also has type List

>Cons(elem, Box::new(self))

>}

>// Return the length of the list

>fn len(&self) -> u32 {

>// `self` has to be matched, because the behavior of this method

>// depends on the variant of `self`

>// `self` has type `&List`, and `*self` has type `List`, matching on a

>// concrete type `T` is preferred over a match on a reference `&T`

>match *self {

>// Can't take ownership of the tail, because `self` is borrowed;

>// instead take a reference to the tail

>Cons(_, ref tail) => 1 + tail.len(),

>// Base Case: An empty list has zero length

>Nil => 0

>}

>}

>// Return representation of the list as a (heap allocated) string

>fn stringify(&self) -> String {

>match *self {

>Cons(head, ref tail) => {

>// `format!` is similar to `print!`, but returns a heap

>// allocated string instead of printing to the console

>format!("{}, {}", head, tail.stringify())

>},

>Nil => {

>format!("Nil")

>},

>}

>}

>}

>fn main() {

>// Create an empty linked list

>let mut list = List::new();

>// Prepend some elements

>list = list.prepend(1);

>list = list.prepend(2);

>list = list.prepend(3);

>// Show the final state of the list

>println!("linked list has length: {}", list.len());

>println!("{}", list.stringify());

>}

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