在Rust中匹配String Tuple

时间:2014-11-22 14:05:35

标签: 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 个答案:

答案 0 :(得分:4)

匹配的每个分支的左侧不是表达式,它是一个模式,它限制了可以去那里的基本上只是文字(加上改变绑定行为的ref之类的东西);函数调用是正确的。鉴于String如何工作,不可能将其中一个变成一个模式(因为你不能静态地构造一个)。可以使用if语句来实现:

if tup == ("foo".to_string(), "bar".to_string()) {
    print!("foobar")
} else {
    print!("Unknown")
}

...或者通过获取String s的一部分,产生可以 构造的类型&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)屈服类型为a的变量b&String

Patterns section of the guide详细介绍了这一主题。

答案 1 :(得分:1)

这里的解决方案是你需要在另一个方向上转换类型:

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