如何有效地将可显示项目推入String?

Fre*_*ios 3 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");
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以用这个:

s.push_str(&format!("{}", thing))
Run Code Online (Sandbox Code Playgroud)

但这不是最有效的,因为format!分配一个String不必要的.

最有效的是直接将可显示项的字符串表示写入String缓冲区.这该怎么做?

Mat*_* M. 6

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

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");
}
Run Code Online (Sandbox Code Playgroud)

任何实现其中一个Write特征(和String确实)的东西都是有效的目标write!.

注意:实际上任何实现write_fmt方法的东西,因为宏都不关心语义; 这就是为什么fmt::Write或者io::Write工作的原因.