2016-02-19 33 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()'。 –