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

Последнее обновление: 06.05.2021

Перечисления или тип 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.

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850