在Rust中匹配字符串元组

3
这是一个简单但我不知道如何在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 `,`, found `.`
-:3          &("foo".as_string(),"bar".as_string())=> { print!("foobar"); }
                    ^

如何进行匹配?
2个回答

4
每个匹配分支的左侧不是一个表达式,而是一种模式,它限制了基本上只能是字面量(加上像ref这样改变绑定行为的东西)的内容。函数调用是完全不行的。考虑到String的工作方式,不可能将其中一个字符串静态地构建成一个模式。可以通过if语句实现此目的:
if tup == ("foo".to_string(), "bar".to_string()) {
    print!("foobar")
} else {
    print!("Unknown")
}

通过获取字符串的一个片段,可以产生类型为&str的结果,也可以使用字面量直接构造:

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

构造新的 String 每次都是一种代价很高的做法,而使用切片基本上是免费的,不需要进行任何分配。
请注意,.0.1 在箱子上需要 #![feature(tuple_indexing)]; 因此可以这样做而不需要它:
 let (ref a, ref b) = tup;
 match (a.as_slice(), b.as_slice()) {
     ("foo", "bar") => print!("foobar"),
     _ => print!("Unknown"),
 }

因为,你看,一个let语句的左侧也是一个模式,所以你可以使用它将元组分解,使用(ref a, ref b)获取每个元素的引用,变量ab都是类型为&String的引用。 模式部分的指南对这个主题进行了更详细的介绍。

1
这里的解决方案是需要在另一个方向上进行类型转换:
match (tup.0.as_slice(), tup.1.as_slice()) {
    ("foo", "bar") => print!("foobar"),
}

第一个操作后面不是也缺少了逗号吗?我记得模式匹配的参数之间必须用逗号分隔。 - Matthieu M.
@FrancisGagné:谢谢! - Matthieu M.

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