匹配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é:谢谢!