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șteformat!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.