usize { /-6ren">
gpt4 book ai didi

rust - 如何确定可以格式化的字体的打印宽度?

转载 作者:行者123 更新时间:2023-12-04 06:10:01 32 4
gpt4 key购买 nike

如果一个类型实现了 Debug,我如何确定从 println!("{:?}", ...) 打印的内容的宽度?

fn width<T: std::fmt::Debug>(to_print_later: &T) -> usize {
// what goes here?
}

最好不要在堆上实际分配任何东西,而且绝对不要实际打印任何东西。

最佳答案

如果不实际执行格式化,您将无法执行此操作。默认情况下,格式化是惰性的,格式化特征没有允许查询大小的方法。

此外,Debug::fmt 的类型实现可能分配也可能不分配,因此不可能说分配会发生。

最简单的做法是创建一个字符串并返回字符串的长度:

fn width(to_print_later: &impl std::fmt::Debug) -> usize {
format!("{:?}", to_print_later).len()
}

如果你想避免自己分配,你可以自己编写fmt::Write的实现器并格式化进去,只计算长度:

use std::fmt::{self, Write};

fn width(to_print_later: &impl fmt::Debug) -> usize {
let mut c = CountingWriter::default();
write!(&mut c, "{:?}", to_print_later).expect("Exceeded the usize");
c.0
}

#[derive(Debug, Default)]
struct CountingWriter(usize);

impl fmt::Write for CountingWriter {
fn write_str(&mut self, s: &str) -> fmt::Result {
self.0 = usize::checked_add(self.0, s.len()).ok_or(fmt::Error)?;
Ok(())
}
}

这不是一个确定的性能胜利,因为 Debug::fmt 的实现可能是重量级部分,而不是分配。像往常一样,了解什么最适合您的情况。


请注意,我在此答案中使用了 Debug,但它也适用于其他特征,例如 DisplayLowerHex

关于rust - 如何确定可以格式化的字体的打印宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61081232/

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