See this example:
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");
}
I know that I can use this:
s.push_str(&format!("{}", thing))
but this is not the most efficient, because format!
allocate a String
that is not necessary.
The most efficient is to write directly the string representation of the displayable item into the String
buffer. How to do this?
There are multiple formatting macros, and in your case you want the write!
macro:
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");
}
Anything that implements one of the Write
trait (and String
does) is a valid target for write!
.
Note: actually anything that implements a write_fmt
method, as macro don't care much about semantics; which is why either fmt::Write
or io::Write
work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With