concat! în Rust

Lipește literali (texte, numere, bool, char) într-un singur &'static str, la compilare, fără niciun cost la rulare.

Sintaxă
concat!("text", 42, true, 'c', 3.5)    // -> "text42truec3.5" (&'static str)

Ce face concat!

concat! primește literali (texte, numere, true/false, caractere) și îi lipește într-un singur literal de text, la compilare. Rezultatul este un &'static str, deci poate fi folosit în const și oriunde se cere un literal.

Nu acceptă variabile sau constante, doar literali și alte macro-uri care produc literali (env!, stringify!, line!, file!). De aceea se folosește mai ales în alte macro-uri sau pentru texte construite din informații de compilare.

Pentru a lipi valori aflate la rulare folosește format! sau String::push_str.

Exemple

Exemplul 1: Literali și macro-uri de compilare

Tot textul este calculat la compilare. line!() dă numărul liniei pe care apare macro-ul.

const SITE: &str = concat!("https://", "dexblog", ".ro");
const INFO: &str = concat!("versiune ", 2, ".", 4, ", beta: ", true);

fn main() {
    println!("{SITE}");
    println!("{INFO}");
    println!("{}", concat!("mesaj de pe linia ", line!()));
}

Rezultat

https://dexblog.ro
versiune 2.4, beta: true
mesaj de pe linia 7

Exemplul 2: În interiorul unui macro propriu

stringify! transformă numele câmpului în text, iar concat! construiește eticheta la compilare.

macro_rules! afiseaza_camp {
    ($obiect:ident . $camp:ident) => {
        println!(concat!(stringify!($camp), " = {:?}"), $obiect.$camp)
    };
}

struct Elev {
    nume: String,
    clasa: u8,
}

fn main() {
    let e = Elev { nume: "Ioana".to_string(), clasa: 11 };
    afiseaza_camp!(e.nume);
    afiseaza_camp!(e.clasa);
}

Rezultat

nume = "Ioana"
clasa = 11

Greșeli frecvente

  • Dai o variabilă sau o constantă: concat!(SITE, "/invata") dă expected a literal. Folosește format! sau scrie literalul direct.
  • Te aștepți ca concat!(0x1F) să dea "0x1F": literalii întregi sunt scriși în baza 10, deci rezultatul este "31". Pune textul exact între ghilimele.

Comenzi înrudite

  • stringify!: Transformă codul primit în text, fără să-l execute. Folosit în macro-uri pentru mesaje care arată expresia exactă.
  • format! (și sintaxa de formatare): Construiește un String nou din șablon și valori, cu aceeași sintaxă ca println!, dar fără să afișeze nimic.
  • line!, file! și column!: Dau poziția din codul sursă unde sunt scrise: numărul liniei, coloana și numele fișierului. Utile în mesaje de jurnal și erori.
  • env! (și option_env!): Citește o variabilă de mediu la compilare și o pune în program ca &’static str. Pentru valori la rulare se folosește std::env::var.