Перечисления

Ключевое слово enum позволяет создавать тип данных, который представляет собой один из нескольких возможных вариантов. Любой вариант, действительный как struct, также действителен как enum.

// Создаём `enum` для классификации web-событий. Обратите внимание

// как имена и информация о типе определяют вариант:

// `PageLoad != PageUnload` и `KeyPress(char) != Paste(String)`.

// Все они разные и независимые.

enum WebEvent {

// `enum` может быть как `unit-подобным`,

PageLoad,

PageUnload,

// так и кортежной структурой,

KeyPress(char),

Paste(String),

// или c-подобной структурой.

Click { x: i64, y: i64 },

}

// Функция, которая получает на вход `WebEvent` и ничего не возвращает.

fn inspect(event: WebEvent) {

match event {

WebEvent::PageLoad => println!("страница загружена"),

WebEvent::PageUnload => println!("страница выгружена"),

// Извлечём `c` из `enum`.

WebEvent::KeyPress(c) => println!("нажата '{}'.", c),

WebEvent::Paste(s) => println!("нажата \"{}\".", s),

// Разберём `Click` на `x` и `y`.

WebEvent::Click { x, y } => {

println!("кликнуто на x={}, y={}.", x, y);

},

}

}

fn main() {

let pressed = WebEvent::KeyPress('x');

// `to_owned()` создаст `String` из строкового среза.

let pasted  = WebEvent::Paste("мой текст".to_owned());

let click   = WebEvent::Click { x: 20, y: 80 };

let load    = WebEvent::PageLoad;

let unload  = WebEvent::PageUnload;

inspect(pressed);

inspect(pasted);

inspect(click);

inspect(load);

inspect(unload);

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Псевдонимы типов

Если вы используете псевдонимы типов, то вы можете обратиться к каждому варианту перечисления через его псевдоним. Это может быть полезно если перечисление имеет слишком длинное имя или слишком много обобщений и вы хотите переименовать его.

enum VeryVerboseEnumOfThingsToDoWithNumbers {

Add,

Subtract,

}

// Создаётся псевдоним типа

type Operations = VeryVerboseEnumOfThingsToDoWithNumbers;

fn main() {

// Мы можем обратиться в каждому варианту перечисления через его

// псевдоним, а не через его длиное неудобное имя.

let x = Operations::Add;

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Наиболее частое место, где вы можете это увидеть, это impl-блоки, которые используют Self.

enum VeryVerboseEnumOfThingsToDoWithNumbers {

Add,

Subtract,

}

impl VeryVerboseEnumOfThingsToDoWithNumbers {

fn run(&self, x: i32, y: i32) -> i32 {

match self {

Self::Add => x + y,

Self::Subtract => x - y,

}

}

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Чтобы больше узнать о перечислениях и псевдонимах типов, вы можете почитать отчёт о стабилизации, в котором эта возможность была включена в Rust.

Смотрите также:

match, fn, String и "Type alias enum variants" RFC

Загрузка...