我觉得很奇怪,Iterator::take_while它取得了迭代器的所有权.这似乎是一个有用的功能,能够获取满足某些功能但仍保留原始迭代器中其余元素的前x个元素.
我知道这与懒惰的实现不兼容take_while,但仍然感觉很有用.这只是被认为不足以包含在标准库中,还是还有其他一些我没有看到的问题?
编者注:这个代码示例来自1.0之前的Rust版本,当时实现了许多迭代器
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,永远循环.似乎它iter每次调用都使用一个克隆take_while,从同一个位置一遍又一遍地开始.我希望iter每次都使用相同的方法,在所有each_times上推进相同的迭代器.这可能吗?
似乎在计数时消耗了迭代器.我如何使用相同的迭代器进行计数然后迭代它?
我正在尝试计算文件中的行,然后打印它们.我能够读取文件内容,我能够计算行数,但是我不再能够遍历这些行,就像内部游标位于迭代器的末尾一样.
use std::fs::File;
use std::io::prelude::*;
fn main() {
let log_file_name = "/home/myuser/test.log";
let mut log_file = File::open(log_file_name).unwrap();
let mut log_content: String = String::from("");
//Reads the log file.
log_file.read_to_string(&mut log_content).unwrap();
//Gets all the lines in a Lines struct.
let mut lines = log_content.lines();
//Uses by_ref() in order to not take ownership
let count = lines.by_ref().count();
println!("{} lines", count); //Prints the count
//Doesn't enter in the loop
for value in lines {
println!("{}", value);
}
}
Run Code Online (Sandbox Code Playgroud)