Read::read
의 간단한 구현이 당신이 부분 읽기 반환 할 수있는 경우 : 당신은 더 많은 데이터를 읽는 계속받을 때때로 당신의 위치를 추적하고 일부 임시 값에 유지해야합니다. Sheemaster와 비슷한 구조로 시작하십시오.
use std::io::{self, Read};
struct IteratorAsRead<I>
where
I: Iterator,
{
iter: I,
leftover: Option<(I::Item, usize)>,
}
impl<I> IteratorAsRead<I>
where
I: Iterator,
{
pub fn new<T>(iter: T) -> Self
where
T: IntoIterator<IntoIter = I, Item = I::Item>,
{
IteratorAsRead {
iter: iter.into_iter(),
leftover: None,
}
}
}
그런 다음 먼저 읽을 수있는 비어 있지 않은 문자열을 찾는 버퍼에 쓰기를 시도하고, 필요가있을 경우 마지막으로 어떤 먹다 남은 음식을 저장하여 기능을 구현합니다.
impl<I> Read for IteratorAsRead<I>
where
I: Iterator,
I::Item: AsRef<[u8]>,
{
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let (leftover, skip) = match self.leftover.take() {
Some(last) => last,
None => match self.iter.find(|next| !next.as_ref().is_empty()) {
Some(next) => (next, 0),
None => return Ok(0),
}
};
let read = (&leftover.as_ref()[skip..]).read(buf)?;
if skip + read < leftover.as_ref().len() {
self.leftover = Some((leftover, skip + read));
} else {
self.leftover = None;
}
return Ok(read);
}
}
이 질문은 irc.mozilla.org의 #rust에있는 Rust IRC 사용자 "njoodle"에서 왔지만 그 시간 동안 IRC 로깅이 작동하지 않는 것으로 보입니다. 그래서 나는 완전한 authorship 링크를 제공 할 수 없습니다. – Shepmaster