gpt4 book ai didi

io - 在 Rust 中将 write_all 写入 Write 的更简洁的方法

转载 作者:行者123 更新时间:2023-11-29 08:14:35 31 4
gpt4 key购买 nike

我创建了一个助手来将切片中的所有数据写入 Write 类型,但它非常冗长且容易出错。我想知道是否有更好的方法来忽略 ErrorKind::Interrupted(来自 EINTR)。

fn _write_all<OutputType> (w : &mut OutputType, buf : &[u8]) -> Result<(), io::Error>
where OutputType: Write {
let mut total_written : usize = 0;
while total_written < buf.len() {
match w.write(&buf[total_written..]) {
Err(e) => {
match e.kind() {
ErrorKind::Interrupted => continue,
_ => return Err(e),
}
},
Ok(cur_written) => {
if cur_written == 0 {
return Err(Error::new(ErrorKind::UnexpectedEof, "Write EOF"));
}
total_written += cur_written;
}
}
}
Ok(())
}

我有一种感觉,大多数用户会使用 try! 宏并简单地忽略 ErrorKind::Interrupted 并且当程序因为带有 EINTR 的繁忙系统。

如果有更好的方式来写这篇文章,我会很想知道。

输入也会出现类似的问题,包括嵌套匹配。

为了记录,RFC 517 (IO / OS Reform)声明 write_all 忽略 EINTR 错误,但是 the documentation for Write::write_all提到 write_all 返回遇到的第一个错误,需要与所介绍的类似的循环。

最佳答案

文档有误。 std::io::Write::write_all 如果 std::io::Write::write 返回 ErrorKind,重试: :Interrupted,可见in the source :

fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
while !buf.is_empty() {
match self.write(buf) {
Ok(0) => return Err(Error::new(ErrorKind::WriteZero,
"failed to write whole buffer")),
Ok(n) => buf = &buf[n..],
Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
Err(e) => return Err(e),
}
}
Ok(())
}

关于io - 在 Rust 中将 write_all 写入 Write 的更简洁的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36245551/

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