【发布时间】:2014-05-31 10:52:52
【问题描述】:
编者注:此代码示例来自 Rust 1.0 之前的版本,当时许多迭代器实现了
Copy。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。
我正在尝试编写一个函数来将字符串拆分为字母和数字块;例如,"test123test" 会变成[ "test", "123", "test" ]。到目前为止,这是我的尝试:
pub fn split(input: &str) -> Vec<String> {
let mut bits: Vec<String> = vec![];
let mut iter = input.chars().peekable();
loop {
match iter.peek() {
None => return bits,
Some(c) => if c.is_digit() {
bits.push(iter.take_while(|c| c.is_digit()).collect());
} else {
bits.push(iter.take_while(|c| !c.is_digit()).collect());
}
}
}
return bits;
}
但是,这不起作用,永远循环。每次我调用take_while 时,它似乎都在使用iter 的克隆,一遍又一遍地从同一个位置开始。我希望它每次都使用相同的iter,在所有each_times 上推进相同的迭代器。这可能吗?
【问题讨论】:
-
对于它的价值,截至 2015 年 2 月,
Peekable<Chars>不是Copy,因此原始代码不会无限循环——它会引发编译错误,表明调用时所有权更改take_while。参见,例如:is.gd/1ppVX0
标签: rust