הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
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");
}
}