[英]How can I pattern match on a vector of string slices and extract values?
我有一个字符串输入需要拆分为值和模式匹配,所以我正在寻找最好的方法来做到这一点。
这是我到目前为止所得到的。
fn main() {
let s: &str = "A 1 2 3 4";
let v: Vec<&str> = s.split(" ").collect();
match &v[..] {
[letter, x1, x2, x3] => println!("{:?}", letter), //do something with values
[letter, x1, x2, x3, x4] => println!("{:?}", letter), //do something with values
_ => println!("no match"),
}
}
我对这种方法有几个问题:
error: slice pattern syntax is experimental (see issue #23121)
所以我假设我必须每晚使用它才能工作? 我是否还必须为其导入任何其他模块?("A", 1, 2, 3, 4)
匹配而("A", 1, 2, "D")
不匹配?
- 此代码产生错误
error: slice pattern syntax is experimental (see issue #23121)
所以我假设我必须每晚使用它才能工作? 我是否还必须为其导入任何其他模块?
在Rust 1.26之前,您必须使用夜间编译器并将#![feature(slice_patterns)]
到您的 crate 根目录。 从 Rust 1.26 开始,您的原始代码按原样运行。
- 是否有类似的简单方法不需要每晚?
在您的示例中,您根据结果向量的长度进行分支。 所以当然你可以只match v.len()
。 一旦知道向量的长度,就可以使用[]
访问它。 要将这些绑定到好名字,你可以这样做:
match v.len() {
4 => {
let (letter, x1, x2, x3) = (v[0], v[1], v[2], v[3]);
// ...
}
// ...
}
它当然不如切片模式那么好,但至少在所需的语法可用之前它可以在稳定的 Rust 上工作。
- 有没有一种优雅的方法来进一步匹配以提取整数值? 例如,是否可以将向量转换为元组,以便 ("A", 1, 2, 3, 4) 匹配而 ("A", 1, 2, "D") 不匹配?
你不能真正在模式匹配中进行类型转换。 将切片转换为元组也不起作用——两者都是非常不同的类型。 切片是同质的,它们的长度在编译时是未知的; 元组可以保存不同类型的变量,并且它们的长度必须在编译时知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.