字符串拆分模式匹配和提取值

时间:2016-03-28 13:01:59

标签: rust

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

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

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")不匹配?

1 个答案:

答案 0 :(得分:2)

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

是的,现在你必须使用夜间编译器。您还必须将#![feature(slice_patterns)]添加到您的crate-root。

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

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

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

它肯定不如切片模式好,但至少它适用于稳定。

  
      
  1. 是否有一种优雅的方式来进一步匹配以提取整数值?例如,可以将向量转换为元组,以便(&#34; A&#34;,1,2,3,4)匹配并且(&#34; A&#34;,1,2,&#34 ; D&#34;)不会?
  2.   

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