看这个例子:
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缓冲区.这该怎么做?
有多个格式化宏,在您的情况下,您需要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工作的原因.
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |