gpt4 book ai didi

rust - 努力在 io::Write 中包装 fmt::Formatter

转载 作者:行者123 更新时间:2023-12-03 11:43:12 25 4
gpt4 key购买 nike

我有一个函数可以将我的 DocObj 呈现为 fmt::Write:

impl DocObj {
fn render(&self, write: &mut dyn Write) -> io::Result<()>;
}

为了实现 fmt::Display,我想将相同的字节写入 fmt::Formatter,而无需复制和粘贴代码。

我是使用rust 的新手,我尝试了多种解决方案,但到目前为止都没有效果。

这是我尝试过的:

策略 1:为 std::Formatter 实现 Write trait

失败是因为 Rust 不允许我在另一个 crate 中实现一个类型的特征。好的。

策略 2:为实现 Writestd::Formatter 创建一个小包装器

失败是因为我还不够了解生命周期或使用rust 。

struct DisplayWriter<'a> {
formatter: &'a fmt::Formatter<'a>
}

impl<'a> DisplayWriter<'a> {
fn from_formatter(aformatter: &'a mut fmt::Formatter<'a>) -> DisplayWriter<'a> {
DisplayWriter {formatter: aformatter}
}
}

impl<'a> io::Write for DisplayWriter<'a> {
fn write(&mut self, bytes: &[u8]) -> std::result::Result<usize, std::io::Error> {
use std::fmt::Write;
for c in bytes.iter() {
match self.formatter.write_char(*c as char) {
Err(err) => return Err(io::Error::new(io::ErrorKind::Other, err))
}
}
Ok(bytes.len())
}
fn flush(&mut self) -> std::result::Result<(), std::io::Error> { todo!() }
}

impl fmt::Display for DocObj {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let write = DisplayWriter::from_formatter(f);
match self.render(&mut write) {
Ok(_) => Ok(()),
Err(err) => Err(fmt::Error)
}
}
}

对于这段代码,编译器会提示错误信息:

error[E0623]: lifetime mismatch
--> src\cos.rs:286:51
|
285 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
| -------------------
| |
| these two types are declared with different lifetimes...
286 | let write = DisplayWriter::from_formatter(f);
| ^ ...but data from `f` flows into `f` here

关于我的背景的一些注释:

  1. 我要显示的字节不是 UTF-8 编码的。它们是二进制的。我想为每个字节显示一个字符。因此,任何进行 UTF 编码或解码的解决方案都不适用于我的上下文。
  2. 代码处于高性能循环中,因此我想避免分配内存。

感谢您的帮助!

最佳答案

std::Formatter already implements Write , 所以你可以通过直接调用你的 render 方法来实现显示:

impl Display for DocObj {
fn fmt (&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.render (f).or (Err (fmt::Err))
}
}

关于rust - 努力在 io::Write 中包装 fmt::Formatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61742282/

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