在Rust中读取和解析字符串到Iterator的函数

Tim*_*kov 2 rust

有没有办法编写一个如下所示的函数:

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)

A.B*_*.B. 5

迭代器是懒惰的.这意味着它们运行的​​数据只要是迭代器本身就需要存在,但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)