Rust 中 .. 和 _ 有什么区别?

Afs*_*fsa 27 pattern-matching match rust

在这种情况下,两个句点和下划线之间有什么区别:

 let a = Some("a");
    match a {
        Some(_) => println!("we are in match _"),

        _ => panic!(),
    }
    match a {
        Some(..) => println!("we are in match .."),
        _ => panic!(),
    }
Run Code Online (Sandbox Code Playgroud)

两者都可以编译并运行,但是为什么要选择其中一个而不是另一个呢?

Cha*_*man 32

在这种情况下,没有区别。

一般来说,_忽略一个元素(字段、数组元素、元组字段等),同时..忽略剩下的所有字段(除了明确指定的字段等之外的所有字段)。但由于Some只包含一个字段,因此具有相同的效果。

这是它们不同的示例:

struct Foo(u32, u32);

fn foo(v: Foo) {
    match v {
        Foo(..) => {}
        Foo(_, _) => {}
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 更喜欢“..”形式(甚至“Foo { .. }”,它甚至适用于元组结构/枚举变体)的原因之一是,它使匹配对参数数量的变化或是否使用声明中的大括号或元组样式。(或者,如果您“希望”代码被破坏并需要审查对变体的任何更改,您可以更喜欢“_”形式。)当您有一大堆带有各种参数的变体时,很方便能够以相同的方式编写所有分支。 (9认同)