见这个例子:
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
缓冲区。怎么做?
答案 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::Write
或io::Write
工作的原因。