【问题标题】:How can I pattern match on a vector of string slices and extract values?如何对字符串切片向量进行模式匹配并提取值?
【发布时间】:2016-03-28 13:01:59
【问题描述】:

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

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

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. 是否有类似简单的方法不需要每晚?
  3. 是否有一种优雅的方法可以进一步匹配以提取整数值?例如,是否可以将向量转换为元组,以便 ("A", 1, 2, 3, 4) 匹配而 ("A", 1, 2, "D") 不匹配?

【问题讨论】:

    标签: rust pattern-matching


    【解决方案1】:
    1. 此代码产生错误error: slice pattern syntax is experimental (see issue #23121) 所以我假设我必须每晚使用它才能工作?我还需要为它导入任何其他模块吗?

    Rust 1.26 之前,您必须使用夜间编译器并将#![feature(slice_patterns)] 添加到您的板条箱根目录。从 Rust 1.26 开始,您的原始代码按原样运行。

    1. 是否有类似的简单方法不需要每晚?

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

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

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

    1. 是否有一种优雅的方法可以进一步匹配以提取整数值?例如,是否可以将向量转换为元组,以便 ("A", 1, 2, 3, 4) 匹配而 ("A", 1, 2, "D") 不匹配?

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

    【讨论】:

    • 我认为这不值得一个完整的答案,但这就是 scan-rules crate 的设计目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2011-12-10
    • 2020-06-18
    相关资源
    最近更新 更多