2016-02-19 28 views
3

我试图解析其具有类似于此格式的特定字符串:消耗串的部分,而遍历它

prefix,body1:body2 

我想用.chars法和其他方法,如.take_while等这样的:

let chars = str.chars(); 
let prefix: String = chars.take_while(|&c| c != ',').collect(); 
let body1: String = chars.take_while(|&c| c != ':').collect(); 
let body2: String = chars.take_while(|_| true).collect(); 

Playground

但是编译器会抱怨:

error: use of moved value: `chars` [E0382] 
    let body1: String = chars.take_while(|&c| c != ':').collect(); 
         ^~~~~ 
help: see the detailed explanation for E0382 
note: `chars` moved here because it has type `core::str::Chars<'_>`, which is non-copyable 
    let prefix: String = chars.take_while(|&c| c != ',').collect(); 
            ^~~~~ 

我可以将其重写为一个普通的for循环并累加值,但这是我想避免的。

回答

3

这可能是最简单的,只是split的分隔符的字符串:

fn main() { 
    let s = "prefix,body1:body2"; 
    let parts: Vec<_> = s.split(|c| c == ',' || c == ':').collect(); 
    println!("{:?}", parts); 
} 

不过,如果你想使用迭代器,你能避免采取与Iterator::by_ref一个可变引用它消耗Chars迭代器:

let str = "prefix,body1:body2"; 
let mut chars = str.chars(); 
let prefix: String = chars.by_ref().take_while(|&c| c != ',').collect(); 
let body1: String = chars.by_ref().take_while(|&c| c != ':').collect(); 
let body2: String = chars.take_while(|_| true).collect(); 

有关by_ref更多信息,请参见:

+0

不错!但个人而言,我总是会忘记有像'by_ref','as_mut'等方法可以完成Rust魔法。 – franza

+2

@franza,'take_while(| _ | true)'是不必要的,你可以直接调用'collect()'。 –