所以我正在学习Rust,学习模式匹配和“if let”语句作为匹配表达式的替代方法。我正在看this video关于“if let”的文章,在11:00提到,他们给予了这个例子:
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”语句差,而我没有意识到?
3条答案
按热度按时间holgip5t1#
这个例子不是很好。但是考虑一下:
仅当选项内的值为
Some(...)
时才打印该值。如果您只对一种特定情况感兴趣,那么
if let
就是match
的简写版。还要注意,
==
只能用于实现PartialEq
的类型,而if let
可以用于任何可以进行模式匹配的类型。yebdmbv42#
if let
表单使您比示例更通用。除非定义了n
,否则您无法执行if some_value == Some(n)
,但您可以执行以下操作:现在,它提供了一个可以使用的
n
。我想当您使用Rust时,您会发现对于某些特定值,匹配表单
Some(n)
比Some(1)
显示得更频繁。别忘了你也可以这样做:
如果使用常规的
if
,这将非常棘手,除非您使用这样的匹配:因此,这里有许多有用的选项,可能更适合某些情况。
不要忘记
cargo clippy
,它会指出是否有更好的表达方式。3z6pesqy3#
除了其他答案中提到的优点之外,
if let
的另一个优点是,您并不总是可以使用==
。(他们不实现PartialEq
),原因可能有多种(库的作者没有考虑到这一点/类型包含一些不支持比较的结构/比较对这些类型没有意义)。在这些情况下,你不能使用==
,但是你仍然可以使用if let
。