Из ссылки :
Выражение if let семантически похоже на выражение if, но вместо выражения условия оно ожидает ключевое слово let, за которым следует опровержимый шаблон., = и выражение.Если значение выражения в правой части = соответствует шаблону, будет выполнен соответствующий блок, в противном случае поток переходит к следующему блоку else, если он существует.Подобно выражениям if, если выражения let имеют значение, определяемое оцениваемым блоком.
Здесь важной частью является refability .Что значит опровержимая картина, здесь она может быть в разных формах.Например:
enum Test {
First(String, i32, usize),
Second(i32, usize),
Third(i32),
}
Вы можете проверить значение x для значения для 3 различных шаблонов, например:
fn main() {
let x = Test::Second(14, 55);
if let Test::First(a, b, c) = x {}
if let Test::Second(a, b) = x {} //This block will be executed
if let Test::Third(a) = x {}
}
Это называется refability .Но рассмотрим ваш код следующим образом:
enum Test {
Second(i32, usize),
}
fn main() {
let x = Test::Second(14, 55);
if let Test::Second(a, b) = x {}
}
Этот код не будет компилироваться, поскольку шаблон x очевиден, он имеет один шаблон.Вы можете получить дополнительную информацию из справочника об опровержимости .
Также вы не правильно думаете об этом:
if let path = Some(env::args().nth(1)) {
Компилятор выдаст ошибку, такую как неопровержимаяшаблон if-let , потому что, как указано в ссылке, «ключевое слово let сопровождается опровержимым шаблоном».Здесь нет опровержимой картины после «пусть».На самом деле этот код пытается создать переменную с именем path, которая является Option, и это не имеет никакого смысла, потому что нет необходимости " Если ",
Вместо этого Rust ожидает от вас такой записи:
let path = Some(env::args().nth(1)); // This will be seem like Some(Some(value))