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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// Наш пример перечисления

enum Foo {

Bar,

Baz,

Qux(u32)

}

fn main() {

// Создание переменных примера

let a = Foo::Bar;

let b = Foo::Baz;

let c = Foo::Qux(100);

// Переменная `a` соответствует `Foo::Bar`

if let Foo::Bar = a {

println!("a = Foo::Bar");

}

// Переменная `b` не соответствует `Foo::Bar`.

// Поэтому ничего не выведется на экран

if let Foo::Bar = b {

println!("b = Foo::Bar");

}

// Переменная `c` соответствует `Foo::Qux`, которая имеет значение

// аналогичное `Some()` как в предыдущем примере:

if let Foo::Qux(value) = c {

println!("c ={}", value);

}

// С `if let` также работает и привязка

if let Foo::Qux(value @ 100) = c {

println!("c = 100");

}

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Другое преимущество if let в том, что он позволяет сопоставлять нам не параметризованные варианты перечисления. Это возможно даже если для перечисления не реализован и не выведен типаж PartialEq. В некоторых случаях, if Foo::Bar == a не скомпилируется, потому что экземпляры перечисления не могут быть равны. Однако, с if let всё будет работать.

Хотите вызов? Исправьте следующий пример с использованием if let :

// Для это перечисление намеренно не добавлен #[derive(PartialEq)],

// и мы не реализовывали для него PartialEq. Вот почему сравнение Foo::Bar == a терпит неудачу.

enum Foo {Bar}

fn main() {

let a = Foo::Bar;

// Переменная соответствует Foo::Bar

if Foo::Bar == a {

// ^-- это вызовет ошибку компиляции. Используйте `if let` вместо этого.

println!("a is foobar");

}

}

Перейти на страницу:

Похожие книги