在Rust中,..和_之间有什么区别?

27
在这种情况下,两个句号和下划线有什么区别?
 let a = Some("a");
    match a {
        Some(_) => println!("we are in match _"),

        _ => panic!(),
    }
    match a {
        Some(..) => println!("we are in match .."),
        _ => panic!(),
    }

两者都可以编译和运行,但为什么要更喜欢其中一个呢?
1个回答

32
在这种情况下,没有任何区别。
一般来说,_ 忽略一个元素(字段、数组元素、元组字段等),而 .. 忽略剩下的所有元素(除了明确指定的字段之外的所有字段)。但是由于 Some 只包含一个字段,所以效果相同。
以下是它们不同的一个例子:
struct Foo(u32, u32);

fn foo(v: Foo) {
    match v {
        Foo(..) => {}
        Foo(_, _) => {}
    }
}

9
使用..形式(甚至Foo { .. }形式,对于元组结构体/枚举变体也适用)的一个原因是它使得匹配对参数数量的变化或者对声明中使用的花括号或元组样式的变化具有更强的鲁棒性。(或者如果你希望代码在任何变体更改时中断并需要审核,你可以选择_形式。)当你有一堆具有不同类型参数的变体时,能够以相同的方式编写所有分支非常方便。 - Mario Carneiro
9
喜欢使用..形式(甚至是Foo { .. },对于元组结构体/枚举变体也适用)的一个原因是它使得匹配在参数数量或声明中使用大括号或元组样式的变化下更加健壮。(或者如果你希望代码在变体发生任何更改时中断并需要审核,可以选择_形式。)当你有一堆具有各种类型参数的变体时,能够以相同的方式编写所有分支非常方便。 - Mario Carneiro
9
喜欢使用..形式(甚至是Foo { .. },对于元组结构体/枚举变体也适用)的一个原因是它使匹配对参数数量的变化或者声明中使用花括号或元组样式的变化具有弹性。(或者如果你希望代码在变体发生任何更改时中断并需要审核,你可以选择使用_形式。)当你有一堆具有各种参数类型的变体时,能够以相同的方式编写所有分支是很方便的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接