我试图把我的头缠在if let表达式周围,我发现它太违反直觉了。我知道它的作用,但是我无法找到一些细节背后的理由。
第一个细节是赋值运算符的使用而不是比较,第二个细节是操作数的放置。
例如:
let a = Some(5);
if let Some(i) = a {
println!("Hello, {}!", i);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这种方式更“清晰”:
if let Some(i) == a {
println!("Hello, {}!", i);
}
Run Code Online (Sandbox Code Playgroud)
甚至更好:
if let a == Some(i) {
println!("Hello, {}!", i);
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解背后的原因吗?
Rust的语法是
let Some(i) = a
Run Code Online (Sandbox Code Playgroud)
因为我们正在创建一个新变量 i,并使用中的包装值对其进行初始化a。运算符=用于创建新变量。您的左侧有一个模式,右侧有一个表达式。模式中左侧的所有变量均根据右侧表达式中的相应值进行初始化。
比较运算符==在这里没有意义。要说
let Some(i) == a
Run Code Online (Sandbox Code Playgroud)
似乎将返回表达式
let Some(i)
Run Code Online (Sandbox Code Playgroud)
等于表达式
a
Run Code Online (Sandbox Code Playgroud)
在使用时,==您希望左右两侧是已经有值的完整表达式,然后返回它们是否相等。但这不是我们在if-let中所做的。当我们使用if-let时,我们正在创建一个新变量。==仅当可以评估其两侧的表达式时才有意义。
同样,表达式
let a == Some(i)
Run Code Online (Sandbox Code Playgroud)
很奇怪,因为a已经存在。我们当然不是在创建新变量a。反对使用==与以前相同的论点,因为i还不存在。
总而言之,我们=在创建新变量和==测试表达式的相等性时使用(如果表达式中包含变量,则此类变量必须已经存在)。
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |