gpt4 book ai didi

iterator - 如何将使用 Read 特性的代码转换为使用 Iterator 特性?

转载 作者:行者123 更新时间:2023-11-29 08:02:54 24 4
gpt4 key购买 nike

我有一些解析文件的代码,非常类似于下面的代码:

use std::io::Cursor;
use std::io::Result;
use std::io::Read;

fn main() {
let v1 = [1, 2, 3, 4, 5];
let mut c1 = Cursor::new(v1); // *

println!("{:?}", read_one(&mut c1)); // 1
println!("{:?}", read_three(&mut c1)); // 2, 3, 4
println!("{:?}", read_one(&mut c1)); // 5
println!("{:?}", read_one(&mut c1)); // eof
}

fn read_one<R: Read>(r: &mut R) -> Result<u8> {
let mut buf = [0; 1];
r.read_exact(&mut buf)?;
Ok(buf[0])
}

fn read_three<R: Read>(r: &mut R) -> Result<[u8; 3]> {
let mut buf = [0; 3];
r.read_exact(&mut buf)?;
Ok(buf)
}

这里,read_oneread_three 接受一个 Read 特征,从中获取一些字节,并返回结果。然后我可以逐个读取字节。

我想将此代码转换为使用迭代器。也就是说,* 行是

let mut i1 = v1.iter();

尝试这样做时,我遇到了无法找到函数来轻松提取大量项目(类似于 read_exact)或以其他方式部分处理迭代器的问题。似乎大多数迭代器函数都旨在完全使用内容。

迭代器只是一个不好的工具还是我用错了?如果是后者,我如何将此代码转换为使用迭代器?

最佳答案

你可以为此创造自己的特质

use std::io::{Error, ErrorKind, Result};

trait ReadExact {
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>;
}

impl<T> ReadExact for T
where
T: Iterator<Item = u8>,
{
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
for p in buf {
if let Some(b) = self.next() {
*p = b;
} else {
return Err(Error::new(ErrorKind::UnexpectedEof, "Iterator exhausted"));
}
}
Ok(())
}
}

Playground

关于iterator - 如何将使用 Read 特性的代码转换为使用 Iterator 特性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48029811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com