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

时间:2018-02-14 15:27:42

标签: 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");
}

我知道我可以使用它:

s.push_str(&format!("{}", thing))

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

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

1 个答案:

答案 0 :(得分: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");
}

任何实现Write特征之一(和String)的任何内容都是write!的有效目标。

注意:实际上任何实现write_fmt方法的东西,因为宏不关心语义;这就是fmt::Writeio::Write工作的原因。