2016-03-28 42 views
0

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

这是我到目前为止。

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

回答

2
  1. 这段代码产生错误error: slice pattern syntax is experimental (see issue #23121)所以我假设我必须每晚使用它的工作?我还需要为它导入任何附加模块吗?

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

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

在你的例子中,你根据结果向量的长度进行分支。所以当然你可以只是match v.len()。一旦你知道了矢量的长度,你可以用[]来访问它。要绑定那些漂亮的名字,你可以做这样的:

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

这当然不是像你一样的片模式,但至少它的工作原理上是稳定的。

  1. 有没有一种优雅的方式来进一步匹配拉整数值?例如,是否有可能将矢量转换为元组,使得(“A”,1,2,3,4)匹配并且(“A”,1,2,“D”)不会?

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

+2

我不认为这是值得一个完整的答案,但这是['scan-rules'](https://crates.io/crates/scan-rules)箱设计的。 –