rust - 如何在字符串切片向量上进行模式匹配并提取值?

标签 rust pattern-matching

我有一个字符串输入需要拆分为值和模式匹配,所以我正在寻找最好的方法来做到这一点。

这就是我到目前为止所得到的。

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"),
    }
}

我对这种方法有几个问题:

  1. 此代码产生错误 error: slice pattern syntax is experimental (see issue #23121) 所以我假设我必须每晚使用它才能工作?我还必须为它导入任何额外的模块吗?
  2. 是否有不需要 nightly 的类似简单方法?
  3. 是否有一种优雅的方法来进一步匹配以提取整数值?例如,是否可以将向量转换为元组,以便 ("A", 1, 2, 3, 4) 匹配并且 ("A", 1, 2, "D") 不会吗?

最佳答案

  1. This code produces error error: slice pattern syntax is experimental (see issue #23121) so I'm assuming I have to use nightly for it to work? Do I have to import any additional module for it as well?

之前Rust 1.26你必须使用夜间编译器并将 #![feature(slice_patterns)] 添加到你的包根。从 Rust 1.26 开始,您的原始代码按原样工作。

  1. Is there a similarly simple approach that wouldn't require nightly?

在您的示例中,您根据结果向量的长度进行分支。所以你当然可以 match v.len()。一旦知道向量的长度,就可以使用 [] 访问它。要将它们绑定(bind)到漂亮的名称,您可以这样做:

match v.len() {
    4 => {
        let (letter, x1, x2, x3) = (v[0], v[1], v[2], v[3]);
        // ...
    }
    // ...
}

它肯定不如切片模式好,但至少在所需语法可用之前它可以在稳定的 Rust 上运行。

  1. Is there an elegant way to do further matching to pull integer values? For instance is it possible to convert vector into tuple so that ("A", 1, 2, 3, 4) would match and ("A", 1, 2, "D") wouldn't?

您不能真正在模式匹配中进行类型转换。将切片转换为元组也不起作用——两者是完全不同的类型。切片是同质的,它们的长度在编译时是未知的;元组可以包含不同类型的变量,并且必须在编译时知道它们的长度。

关于rust - 如何在字符串切片向量上进行模式匹配并提取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262937/

相关文章:

rust - 如何在库中实现长期变量/状态?

rust - Rust说不使用导入,并且无法同时找到导入的语句

rust - 如何检查切片中是否有重复项?

Java 匹配器不工作

c++ - 在 OpenCV vc++ 中比较两个图像中的特征

rust - 如何在最新版本(3.3.2)中实现Actix-web中间件?

rust - 我们如何在 sqlx rust 中定义 jsonb 和 UUID 字段?

JAVA 字符串中带换行符的最长模式匹配

regex - Ruby - 仅匹配和替换电子邮件中的特定字符

Java 匹配器模式问题