【问题标题】:"if let" statement doesn't make any sense?“if let”语句没有任何意义?
【发布时间】:2023-01-02 12:20:50
【问题描述】:
所以我正在学习 Rust,我正在学习模式匹配和“if let”语句作为匹配表达式的替代方法。我正在看 this video 关于 11:00 提到的“if let”,他们举了这个例子:
fn main() {
let some_value: Option<i32> = Some(3);
if let Some(3) = some_value {
println!("three");
}
}
我知道如果你只有一个特定的模式你想匹配并且匹配的表达式太冗长,这很有用,但如果是这种情况,你不能简单地这样做吗?:
fn main() {
let some_value: Option<i32> = Some(3);
if some_value == Some(3) {
println!("three");
}
}
这个表达式有什么地方不如我不知道的“if let”语句吗?
【问题讨论】:
标签:
if-statement
rust
pattern-matching
【解决方案1】:
if let 表单让您比示例更通用。除非定义了 n,否则您不能执行 if some_value == Some(n),但您可以执行以下操作:
if let Some(n) = some_value { ... }
现在它给你一个可以使用的n。
我想你会发现,当你更多地使用 Rust 时,匹配形式 Some(n) 比 Some(1) 更频繁地出现一些特定值。
别忘了你也可以这样做:
if let Some(1) | Some(2) = some_value { ... }
除非您使用这样的匹配,否则使用常规 if 会更加棘手:
if matches!(some_value, Some(1) | Some(2)) { ... }
因此,这里有许多有用的选项可能更适合某些情况。
不要忘记cargo clippy,它会指出是否有更好的表达方式。
【解决方案2】:
那么这个例子不是很好。但考虑一下:
fn foo(o: Option<i32>) {
if let Some(n) = o {
println!("{n}");
}
}
仅当它是Some(...) 时才打印选项内的值。
if let 是 match 的简写版本,如果您只对一种特定情况感兴趣。