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