有没有办法编写一个如下所示的函数:
fn read_and_iter_u32_line<'a>(mut buf: String) -> Iterator<Item=u32> {
buf.truncate(0);
io::stdin().read_line(&mut buf).unwrap();
buf.split_whitespace()
.map(|s| s.parse::<u32>().unwrap())
}
Run Code Online (Sandbox Code Playgroud)
迭代器是懒惰的.这意味着它们运行的数据只要是迭代器本身就需要存在,但buf在函数返回时就不再存在.如果我们保持buf更长时间它可以工作.
编写返回复杂迭代器的函数目前很棘手,但它有可能:
use std::io;
use std::iter::{Iterator, Map};
use std::str::SplitWhitespace;
fn read_and_iter_u32_line(buf: &mut String) -> Map<SplitWhitespace, fn(&str) -> u32> {
buf.truncate(0);
io::stdin().read_line(buf).unwrap();
buf.split_whitespace().map(parse)
}
fn parse(s: &str) -> u32 {
s.parse::<u32>().unwrap()
}
Run Code Online (Sandbox Code Playgroud)