Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to efficiently push displayable item into String? [duplicate]

Tags:

rust

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?

like image 271
Boiethios Avatar asked Sep 12 '25 12:09

Boiethios


1 Answers

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.

like image 124
Matthieu M. Avatar answered Sep 15 '25 04:09

Matthieu M.