主要有两个问题:
-
let x = y
如何翻译成伪英语/伪代码? -
if let x = y {}
块是如何一步一步地工作的?
总是假设let声明了一个变量,直到我遇到了if let(下面的代码),然后go 谷歌搜索.
let config_max = Some(3u8);
if let Some(max) = config_max {
println!("The maximum is configured to be {}", max);
} else {
println!("xyz");
}
StackOverflow线程解释了这一点.所以我把它理解为让它只判断模式和值是否匹配,而不是自己声明变量:
let y = Some(5);
if let Some(x) = y { doZ(x); }
// 1. let Some(x) = y -- see if pattern Some(x) matches value y, if yes execute next expression
// 2. Some(x) = y -- the next expression, assign value of y to "variable Some(x)"
// if ( 1 and 2 are successful) { execute this }
但是,如果let只用于模式值匹配/求值,那么为什么在变量声明中使用它呢? 答:因为它不仅用于模式匹配,而且是变量声明所需要的.
let y = Some(5);
if let Some(x) = y { doZ(x); }
// if -- if
// let Some(x) = y -- ( if pattern Some(x) matches Some(5), declare variable Some(x) and assign value Some(5) to it )
// doZ(x) -- { execute doZ function and pass x as an argument}
上述"翻译"是否意味着let Some(x) = Some(5)
==let x = 5
?如果是,这是如何发生的?B-Option<T>
和Enum
类型的全部要点不是要与原始T
不同吗?
if let x = 5 { doZ(x); } // a
// Warning: x = 5 is irrefutable, consider using just "let" without "if".
5 == Some(5) // b, false
上面的错误还反驳了if let Some(x) = y
中的if
是否是常规的if,查找布尔值,然后它将运行"{}"中的代码.但是let
是一个语句,它不会返回bool或其他任何值,不管有没有if
.那么,这是否意味着在这个特定的例子中,if
实际上不是if
(执行代码需要bool),而是一个令人精疲力竭的match
?如果是,为什么是if
,而不是其他/新的关键字?