Паттерны и конструкция if let

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

Конструкция if let позволяет объединить синтаксис конструкции if и определение переменной с помощью оператора let.

if let принимает шаблон и выражение, разделенные знаком равно.

if let шаблон = выражение {
	// выполняемые действия
}

Кортежи

Например, нам надо выполнить некоторые действия, если элементы кортежа имеют определенные значения:

fn main() {
 
    let user= ("Tom", 36);
	if let ("Tom", 36) = user {
        println!("name: Tom, age: 36");
    }
}

Здесь ("Tom", 36) представляет шаблон, а кортеж user - выражение, с которым сравниваются значения из шаблона.

В данном случае условие

if let ("Tom", 36) = user 

говорит, что если первый элемент кортежа user равен строке "Tom", а второй - числу 36, то выполняется вывод на консоль.

По большому счету данная конструкция соответствует следующей конструкции match:

match user{
	("Tom", 36) => println!("name: Tom, age: 36"),
	_ => ()
}

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

Также можно определить альтернативные действия на случай, если значения из шаблона не соответствуют выражению:

fn main() {
 
    let user = ("Tomas", 21);
	
	if let ("Tom", 36) = user {
        println!("name: Tom, age: 36");
    }
	else{
		println!("Undefined user");
	}
}

Определение переменных

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

fn main() {
 
    let user = ("Tom", 21);
	
	if let ("Tom", age) = user {
        println!("age: {}", age);
    }
}

В данном случае, если первый компонент кортежа user равен строке "Tom", то второй компонент кортежа user помещается в переменную age, которую затем можно использовать в блоке конструкции if let.

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

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

fn main(){
  
    let morning = DayTime::Morning("Доброе утро".to_string());
    if let DayTime::Morning(message) = morning{
		println!("morning message: {}", message);
	}
}

enum DayTime{
     
    Morning(String),
    Evening(String)
}

В данном случае в конструкции if let переменная morning сопоставляется с шаблоном DayTime::Morning(message):

if let DayTime::Morning(message) = morning{

При сопоставлении значение константы DayTime::Morning попадает в переменную message, которую далее можно использовать.

Структуры

Подобным образом можно использовать и структуры:

struct Person
{
    name: String,
	age: u8,	
	height: f32	
}
fn main(){
     
	let tom = Person{
		name: "Tom".to_string(),
		age: 33,
		height: 1.70
	};
	let username = "Tom".to_string();
	if let Person{name: username, age: 33, height: _} = tom{
		
		println!("Это Том");
	}
}

Здесь шаблон Person{name: username, age: 33, height: _} сопоставляется с переменной tom. Следует учитывать, что в шаблонах нельзя использовать вызовы функций, поэтому создание объекта String вынесено в отдельную переменную username.

Если нам не важно значение какого-то поля, то для него можно указать прочерк, как в случае с полем height.

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