这是一个简单的但我不知道如何做生意的事情。
简单地说:
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"); }
^
你怎么配这个?
答案 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"),
}