Перейти к основному содержанию

8. Условные выражения

Условные выражения это очень интересная тема. С ними вы сможете создавать более сложные программы обладающие вариативностью.

Общий смысл условных выражений в том, что вы проверяете некое условие. В зависимости от его соблюдения, производите действие. Например, вы собираетесь выйти на улицу и проверяете: если снаружи начинается дождь, то берете зонтик, иначе не берете.

В Rust есть следующие типы условных выражений:

  • if (если), if else (если и иначе) – проверка условия.
  • match (совпадение) – сопоставление с образцом.
  • if let - сравнение с шаблоном.

Условное выражение if

Здесь проверяется некое условие, и если оно истинное, то выполняется блок кода. Если не истинное, то пропускается и программа идет дальше. Например:

fn main() {
	if 4 == 10/2 {
		println!{"Четыре равно пяти!"};
	}
	if 365/7 > 24 {
		println!("Недель в году больше, чем часов в сутках");
	}
}
Результат: Недель в году больше, чем часов в сутках

Первое условие ложно, поэтому код в скобках не был исполнен, а второе истинно и текст вывелся в консоль.

Общий синтаксис условного выражения if:

if condition {
	executable code;
}

Расширенное условное выражение if..else

Если условие соблюдается, то выполняется один блок кода, а если не соблюдается, то другой.

fn main() {
	let learn_language: &str = "Rust"; // Изучаемый нами язык программирования

	if learn_language == "Rust" {
		println!("Мы изучаем Rust language.");
	} else {
		println!("Мы изучаем {}.", learn_language);
	}
}
Результат: Мы изучаем Rust language.

Попробуйте дать переменной другое значение.

Кстати, конструкции if..else могут быть вложены друг в друга.

Общий синтаксис проверки условия с блоком кода при несоблюдении условия:

fn main() {
	if condition {
		executable code;
	} else if condition {
		executable code;
	} else {
		executable code;
	}
}

Вот более сложная версия предыдущего примера кода:

fn main() {
	let learn_language: &str = "Rust"; // Изучаемый нами язык программирования

	if learn_language == "Rust" {
		println!("Мы изучаем язык программирования Раст.");
	} else if learn_language == "Python" {
		println!("Мы изучаем язык программирования Питон.");
	} else {
		println!("Мы изучаем {}.", learn_language);
	}
}
Результат: Мы изучаем язык программирования Раст.

В этом примере мы сначала проверяем не является ли изучаемый нами язык Rust, если это не так, то проверяем не Python ли это, а если не Rust и не Python, то тогда уже просто подставляем значение проверяемой переменной в строку как есть.

Однако, для решения этой задачи существует более подходящее условное выражение – match.

Условное выражение match

При использовании match мы берем какую-либо переменную и перечисляем возможные варианты её значения. Затем Rust сопоставляет их и, как только совпадение с одним из вариантов найдено, программа выполняет код справа от знака =>. Также мы можем указать как обработать ситуацию, когда ни один из вариантов не совпал со значением переменной. Для этого используется знак подчеркивания _.

fn main() {
	let learn_language: &str  = "Rust"; // Изучаемый нами язык программирования

	match learn_language {
		"Rust" => println!("Мы изучаем язык программирования Раст."),
		"Python" => println!("Мы изучаем язык программирования Питон."),
		_ => println!("Мы изучаем {}.", learn_language)
	}
 
}
Результат: Мы изучаем язык программирования Раст.

Если бы переменной learn_language мы присвоили какое-либо иное значение, например Java, то программа вывела-бы нам: Мы изучаем Java. Попробуйте в своей среде разработки.

Общий синтаксис match:

match match_value {
    value1 => {executable code;},
    value2 => {executable code;},
    …
    _ => {executable code;},	// default value
}

Присвоение переменной результата match

Есть возможность значение, полученное при сопоставлении с образцом, присвоить некой переменной. Что может быть очень удобно и сделает код яснее.

fn main() {
	let learn_language: &str = "Rust"; // Изучаемый нами язык программирования

	let learn_lang_mod: &str = match learn_language {
		"Rust"   => "Раст",
		"Python" => "Питон",
		_ => learn_language
	};
 
	println!("Мы изучаем язык программирования {}.", learn_lang_mod);
}
Результат: Мы изучаем язык программирования Раст.

В этой программе мы создали переменную в которую записываем модифицированное значение изучаемого нами языка, чтобы распечатать в конце. Если этого языка нет в нашем списке, то мы выкрутимся из ситуации отдавая переменной неизменное значение.

Общий синтаксис присвоения переменной результата сопоставления match:

let result_variable = match match_value {
    value1 => {executable code;},
    value2 => {executable code;},
    …
    _ => {executable code;},	// default value
};

Сравнение по шаблону if let

Конструкция if let стоит особняком от if и match.

Здесь для объяснения приводится ещё не изученный нами тип данных (кортеж), поэтому главу можно пропустить и вернуться к ней позднее.

Давайте предварительно посмотрим пример в котором мы проверяем две переменные на совпадение:

fn main() {
	let course = ("Rust", "beginner","course");
	let course1 = ("Rust", "beginner", "curriculum");
	if course1 == course {
		println!("Значения совпали.");
	}
	else {
		println!("Значения не совпали.");
	}
}
Результат: Значения не совпали.

Конструкция if let по сути делает то же самое, но позволяет проверять частичное совпадение с шаблоном:

fn main() {
    let course = ("Rust", "beginner","course");

    if let ("Rust", "beginner", cur) = course {
        println!("Проверяемые значения совпали с шаблоном.");
    }
    else {
        println!("Совпадений не обнаружено.");
    }

}
Результат: Проверяемые значения совпали с шаблоном.

Здесь мы проверили на соответствие первого и второго значения в кортеже, но мы также можем что-нибудь сделать и с третьим значением, которое попадает в переменную cur. Вы вольны называть эту переменную как захотите. Доработайте эту программу, чтобы значение переменной cur вывелось в консоль.

Общий синтаксис if let:

if let (value1, value2) = match_variable {
    executable code;
} else {
    executable code;
}

Также мы можем проверять на соответствие другому шаблону. Например, использовать сопоставление для выборки курсов для начинающих: (lang, "beginner", c).

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

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

© Клют И. А., 2022. Копирование контента возможно только с письменного разрешения автора.