匹配Rust中的字符串元组

匹配Rust中的字符串元组,rust,Rust,这是一个简单但我不知道怎么做的生锈的东西 简言之: pub fn pair_matcher(tup: &(String, String)) { match tup { &("foo".as_string(), "bar".as_string()) => print!("foobar"), _ => print!("Unknown"), } } 我得到了错误 -:3:17: 3:18 error: expected `,

这是一个简单但我不知道怎么做的生锈的东西

简言之:

pub fn pair_matcher(tup: &(String, String)) {
    match tup {
        &("foo".as_string(), "bar".as_string()) => print!("foobar"),
        _ => print!("Unknown"),
    }
}
我得到了错误

-:3:17: 3:18 error: expected `,`, found `.`
-:3          &("foo".as_string(),"bar".as_string())=> { print!("foobar"); }
                    ^

如何匹配这一点?

这里的解决方案是,您需要向另一个方向强制转换类型:

match (tup.0.as_slice(), tup.1.as_slice()) {
    ("foo", "bar") => print!("foobar"),
}

匹配的每个分支的左侧都不是表达式,而是一种模式,它将可以到达的内容基本上限制为文字(加上改变绑定行为的
ref
);函数调用是正确的。考虑到
String
的工作方式,不可能将其中一个放入模式中(因为您不能静态地构造一个)。如果语句:

if tup == ("foo".to_string(), "bar".to_string()) {
    print!("foobar")
} else {
    print!("Unknown")
}
…或者从
字符串
s中取一个片段,生成类型
&str
,可以按字面意思构造:

match (tup.0.as_slice(), tup.1.as_slice()) {
    ("foo", "bar") => print!("foobar"),
    _ => print!("Unknown"),
}
每次构造一个新的
字符串
都是一种昂贵的方法,而使用切片几乎是免费的,不需要分配

请注意,
.0
.1
需要
#!板条箱上的[特征(元组索引)]
;没有它,我们可以这样做:

 let (ref a, ref b) = tup;
 match (a.as_slice(), b.as_slice()) {
     ("foo", "bar") => print!("foobar"),
     _ => print!("Unknown"),
 }
因为,你看,
let
语句的左侧也是一个模式,所以你可以用它把元组分开,引用每个元素,用
(ref a,ref b)
产生变量
a
b
这两种类型的
&String


这篇文章更详细地介绍了这个主题。

在第一个动作之后是否也缺少了一个
?我以为图案臂必须用逗号隔开。@MatthieuM.@FrancisGagné:谢谢!