在Rust中使动态字符串居中?

在Rust中使动态字符串居中?,rust,formatting,Rust,Formatting,有人会认为它没有理由不起作用,但实际上,它不起作用: fn main() { println!("{:=^50}", "Stuff"); println!("{:=^50}", format_args!("Stuff {}", 42)); } 当然,我可以自己做,但有没有内置的方法可以做到这一点?试试(请参阅): 输出: fn main() { println!("{:=^50}", "Stuff"); println!

有人会认为它没有理由不起作用,但实际上,它不起作用:

fn main() {
    println!("{:=^50}", "Stuff");
    println!("{:=^50}", format_args!("Stuff {}", 42));
}

当然,我可以自己做,但有没有内置的方法可以做到这一点?

试试(请参阅):

输出:

fn main() {
    println!("{:=^50}", "Stuff");
    println!("{:=^50}", format!("Stuff {}", 42));
}
fn main() {
    println!("{:=^50}", "Stuff");
    println!("{:=^50}", std::fmt::format(format_args!("Stuff {}", 42)));
}

尝试:

输出:

fn main() {
    println!("{:=^50}", "Stuff");
    println!("{:=^50}", format!("Stuff {}", 42));
}
fn main() {
    println!("{:=^50}", "Stuff");
    println!("{:=^50}", std::fmt::format(format_args!("Stuff {}", 42)));
}

见:

此宏生成fmt::Arguments类型的值。此值可以传递给std::fmt中的宏,以执行有用的重定向。所有其他格式化宏(format!、write!、println!等)都通过此宏进行代理。格式化参数!,与派生宏不同,它避免了堆分配

:

格式参数!宏将安全地创建此结构的实例。宏在编译时验证格式字符串,以便可以安全地使用write和format函数

见:

impl参数显示)->结果{
写入(fmt.buf,*self)
}
}

最好解释一下为什么需要额外的分配。这还不能真正解释为什么
格式化参数参数不尊重width参数,我假设这是因为它们无法预测将要显示的内容的实际宽度,这与
格式不同它知道,因为它使用了一个临时缓冲区。确切地说,我不明白,它被
print
println宏直接接受
参数
。。。我刚发现一只虫子吗?它不应该默默地失败。除此之外,我问是否有办法做到这一点,我得到了一个答案,谢谢生成类型为
fmt::Arguments
std::fmt::Display
trait of
fmt::Arguments
的值没有对齐(查看内部)我。。。你甚至可以将
参数
传递给
println直接。我的意思是,我想这是有道理的,但似乎有点神奇。但事实并非如此,这就是所谓的
print
println宏直接接受
参数
。。。因此产生了混乱。但是
println本身调用
格式参数
在其参数上,因此您正在生成一个
参数
,其中包含一个
参数
。它之所以有效是因为,这是让我惊讶的部分。是的,我尝试这样做是因为我知道,你可以链接
format\u args尽可能多的次数,这是我习惯于尽可能少地分配日志的事情。。。它在大多数情况下都是有效的,只是出于某种原因,对齐在某种程度上是特殊的,而且完全被忽略了。当我注意到这一点时,我反复检查了我的代码,只是为了检查我是否做错了什么,因为它确实适用于几乎所有其他方面。
======================Stuff=======================
=====================Stuff 42=====================
impl Display for Arguments<'_> {
    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result {
        write(fmt.buf, *self)
    }
}