rust "if let“只是写其他”if“语句的另一种方式吗?

y1aodyip  于 2023-01-05  发布在  其他
关注(0)|答案(3)|浏览(200)

所以我正在学习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”语句差,而我没有意识到?

holgip5t

holgip5t1#

这个例子不是很好。但是考虑一下:

fn foo(o: Option<i32>) {
    if let Some(n) = o {
        println!("{n}");
    }
}

仅当选项内的值为Some(...)时才打印该值。
如果您只对一种特定情况感兴趣,那么if let就是match的简写版。
还要注意,==只能用于实现PartialEq的类型,而if let可以用于任何可以进行模式匹配的类型。

yebdmbv4

yebdmbv42#

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,它会指出是否有更好的表达方式。

3z6pesqy

3z6pesqy3#

除了其他答案中提到的优点之外,if let的另一个优点是,您并不总是可以使用==。(他们不实现PartialEq),原因可能有多种(库的作者没有考虑到这一点/类型包含一些不支持比较的结构/比较对这些类型没有意义)。在这些情况下,你不能使用==,但是你仍然可以使用if let

相关问题