Перечисления или тип enum представляет набор констант или состояний, в которых может пребывать переменная перечисления. И в зависимости от текущего состояния мы можем выполнить те или иные действия.
Формальное определение перечисления:
enum название_перечисления { константа1, константа2, ........... константаN }
После названия перечисления в фигурных скобках через запятую перечисляются константы перечисления.
Например, определим перечисление, которое назовем OperationType
и которое будет представлять арифметические операции:
enum OperationType{ Add, // сложение Subtract, // вычитание Multiply, // умножение Divide // деление }
Для обращения к константе перечисления указывается название перечисления и через два двоеточия его константа:
название_перечисления::константа
Например, мы можем определить переменную перечисления:
let op = OperationType::Multiply;
В данном случае переменная op
представляет константу OperationType::Multiply
.
Как было сказано в начале, перечисления удобны для определения состояний. И в зависимости от текущего состояния выполняется то или иное действие. Например:
fn main(){ // определяем переменную перечисления OperationType let op = OperationType::Multiply; match op { OperationType::Add => println!("Сложение"), OperationType::Subtract => println!("Вычитание"), OperationType::Multiply => println!("Умножение"), OperationType::Divide => println!("Деление") } } enum OperationType{ Add, // сложение Subtract, // вычитание Multiply, // умножение Divide // деление }
Здесь в конструкции match
проверяется состояние переменной op
. В зависимости от значения этой переменной выводится то или иное сообщение на консоль.
Поскольку эта переменная равна OperationType::Multiply
, то будет выполняться выражение:
OperationType::Multiply => println!("Умножение"),
Если в будущем потребуется изменить значение переменной перечисления, то такая переменная должна быть определена с помощью ключевого слова mut. Например, применим перечисление OperationType для выполнения арифметических операций:
fn main(){ let a = 10; let b = 5; let mut op = OperationType::Add; let mut result = get_result(a, b, op); println!("result = {}", result); // result = 15 // меняем операцию op = OperationType::Subtract; result = get_result(a, b, op); // result = 5 println!("result = {}", result); // передаем еще одно значение result = get_result(a, b, OperationType::Divide); println!("result = {}", result); // result = 2 } fn get_result(x: i32, y: i32, op: OperationType) -> i32{ match op { OperationType::Add => x + y, OperationType::Subtract => x - y, OperationType::Multiply => x * y, OperationType::Divide => x / y } } enum OperationType{ Add, // сложение Subtract, // вычитание Multiply, // умножение Divide // деление }
В данном случае все арифметические операции вынесены в отдельную функцию get_result()
, которая в качестве параметров принимает
два числа (над которыми выполняется операция) и значение перечисления OperationType, которое указывает, какую именно операцию надо выполнять.
Результат операции возвращается функцией.
В функции main вызывается функция get_result()
, в которую передаются различные типы операций, и соответственно функция будет возвращать различный результат:
result = 15 result = 5 result = 2
Константы перечисления могут хранить некоторые значения, которые соответствуют их типу. Выше в перечислении OperationType тип для хранимых значений констант не определялся, но мы можем его определить. Например:
enum DayTime{ Morning(String), Evening(String) }
Здесь обе константы перечисления DayTime представляют тип String, то есть по сути они могут хранить некоторую строку.
А это значит, что при создании объекта этого перечисления нам надо передать его строковое значение:
let dt = DayTime::Morning("Доброе утро".to_string());
Значение передается в скобках после названия константы. Поскольку в данном случае константа DayTime::Morning
представляет тип String
,
то переданная строка преобразуется с помощью метода to_string()
к типу String
.
Далее будет рассмотрен синтасис шаблонов, который позволяет получить и использовать значения, хранимые в константах перечисления.