Rust 如何有效地将可显示项推送到字符串中?

Rust 如何有效地将可显示项推送到字符串中?,rust,Rust,请参见此示例: fn concat<T: std::fmt::Display>(s: &mut String, thing: T) { // TODO } fn main() { let mut s = "Hello ".into(); concat(&mut s, 42); assert_eq!(&s, "Hello 42"); } 但是这不是最有效的,因为格式分配一个不必要的字符串 最有效的方法是将可显示项的字符串表示

请参见此示例:

fn concat<T: std::fmt::Display>(s: &mut String, thing: T) {
    // TODO
}

fn main() {
    let mut s = "Hello ".into();
    concat(&mut s, 42);

    assert_eq!(&s, "Hello 42");
}
但是这不是最有效的,因为
格式分配一个不必要的
字符串


最有效的方法是将可显示项的字符串表示形式直接写入
string
缓冲区。如何执行此操作?

有多个格式化宏,在您的情况下,您需要宏:

使用std::fmt::{Display,Write};
fn concat(s:&mut字符串,thing:&T){
写!(s,“{}”,东西);
}
fn main(){
让mut s=“Hello”。into();
concat(和mut s,&42);
assert_eq!(&s,“Hello 42”);
}
任何实现
Write
特性之一(以及
String
的特性)的东西都是
Write的有效目标


注意:实际上任何实现
write\u fmt
方法的东西,因为宏不太关心语义;这就是为什么
fmt::Write
io::Write
有效。

有两个(可用的)
Write
特征(
std::io
std::fmt
)。@Stefan:是的。我不想直截了当地说出来,因为在
write中提到了它我链接的宏文档,但由于您觉得需要它,现在是:)
s.push_str(&format!("{}", thing))
use std::fmt::{Display, Write};

fn concat<T: Display>(s: &mut String, thing: &T) {
    write!(s, "{}", thing).unwrap();
}

fn main() {
    let mut s = "Hello ".into();
    concat(&mut s, &42);

    assert_eq!(&s, "Hello 42");
}