Output in Rust
Hai già usato println! parecchie volte. Questa pagina presenta le altre macro di stampa che incontrerai e quando usare ciascuna.
println! e print!
Sezione intitolata “println! e print!”println! stampa del testo e aggiunge un a capo alla fine. print! fa la stessa cosa ma non aggiunge l’a capo:
fn main() { print!("Ciao, "); print!("mondo"); println!("!");}Output:
Ciao, mondo!Nota che tutte e tre le chiamate hanno stampato sulla stessa riga: solo println! va a capo. In pratica userai println! quasi sempre; print! serve soprattutto quando costruisci una riga un pezzo alla volta.
Segnaposto: {} e variabili con nome
Sezione intitolata “Segnaposto: {} e variabili con nome”Hai visto {} usato come segnaposto. Puoi riempirlo passando un valore dopo la stringa, oppure mettendo il nome della variabile direttamente dentro le graffe:
fn main() { let name = "Ferris"; let age = 10;
println!("{} ha {} anni", name, age); // posizionale println!("{name} ha {age} anni"); // in linea (stesso risultato)}Output:
Ferris ha 10 anniFerris ha 10 anniLe due righe stampano la stessa cosa. Lo stile in linea ({name}) è un po’ più recente e di solito più leggibile, quindi preferiscilo quando puoi.
format!: costruire una stringa invece di stamparla
Sezione intitolata “format!: costruire una stringa invece di stamparla”A volte vuoi il testo formattato come String invece di stamparlo subito, per esempio per salvarlo o passarlo a un’altra funzione. A questo serve format!. Funziona esattamente come println!, ma restituisce una String invece di stampare:
fn main() { let name = "Ferris"; let message = format!("Ciao, {name}!"); println!("{message}");}Output:
Ciao, Ferris!Stampa di debug con {:?}
Sezione intitolata “Stampa di debug con {:?}”Il semplice {} funziona solo con valori che sanno mostrarsi come testo: numeri, stringhe, booleani. Con valori più complessi come tuple o struct, {} non compila. Usa invece {:?} (il formato «debug»):
fn main() { let point = (3, 7); println!("{:?}", point);}Output:
(3, 7)Per un’impaginazione più gradevole, su più righe, con valori più grandi usa {:#?} (pretty-print):
fn main() { let point = (3, 7); println!("{:#?}", point);}Output:
( 3, 7,)Formattare i numeri
Sezione intitolata “Formattare i numeri”Qualche trucco di formattazione che capita spesso:
fn main() { let pi = 3.14159; println!("{:.2}", pi); // 2 cifre decimali -> 3.14 println!("{:5}", 42); // larghezza 5 -> " 42" println!("{:08.2}", pi); // riempi con zeri -> 00003.14}Output:
3.14 4200003.14Non devi impararli a memoria: ti basta sapere che esistono, per quando devi allineare dei numeri o arrotondare dei decimali.
Allineare il testo e stampare le graffe
Sezione intitolata “Allineare il testo e stampare le graffe”La larghezza funziona anche con il testo, e puoi scegliere da che lato si appoggia il valore. Dopo i : metti < (sinistra), > (destra) o ^ (centro), poi la larghezza. Davanti puoi anche mettere un carattere di riempimento, come -:
fn main() { let coffee = 3.5; let bagel = 2.25;
println!("{:-^20}", " MENU "); println!("{:<12}{:>8}", "Articolo", "Prezzo"); println!("{:<12}{:>8.2}", "Caffè", coffee); println!("{:<12}{:>8.2}", "Cornetto", bagel); println!("{:<12}{:>8.2}", "Totale", coffee + bagel);}Output:
------- MENU -------Articolo PrezzoCaffè 3.50Cornetto 2.25Totale 5.75Leggiamo {:>8.2} pezzo per pezzo: > significa allineato a destra, 8 è la larghezza e .2 significa due cifre decimali. Allineare i numeri a destra mette in colonna i punti decimali, ed è per questo che scontrini e tabelle lo fanno. (Rust usa sempre il punto come separatore decimale, non la virgola.)
E se vuoi una vera { nell’output? Siccome le graffe significano «segnaposto», le raddoppi: {{ stampa { e }} stampa }.
fn main() { println!("Insieme: {{{}, {}}}", 1, 2);}Output:
Insieme: {1, 2}Pratica
Sezione intitolata “Pratica”1. Un cartellino del prezzo
Sezione intitolata “1. Un cartellino del prezzo”Salva l’articolo "Quaderno" e il prezzo 2.5, poi stampa Quaderno costa 2.50 euro. Suggerimento: {:.2} arrotonda a due cifre decimali, e funziona anche in linea: {price:.2}.
Mostra la soluzione
fn main() { let item = "Quaderno"; let price = 2.5; println!("{item} costa {price:.2} euro");}Output:
Quaderno costa 2.50 euro2. Costruisci un’etichetta, poi stampala in due modi
Sezione intitolata “2. Costruisci un’etichetta, poi stampala in due modi”Usa format! per costruire un’etichetta ferris-7 a partire dal nome "ferris" e dal numero 7. Stampala una volta con {} e una volta con {:?}, e trova la differenza. Suggerimento: format! accetta esattamente gli stessi segnaposto di println!.
Mostra la soluzione
fn main() { let name = "ferris"; let id = 7; let label = format!("{name}-{id}");
println!("{label}"); println!("{label:?}");}Output:
ferris-7"ferris-7"La stampa di debug mostra il testo tra virgolette, così vedi esattamente dove inizia e dove finisce. È comodo quando un valore contiene spazi di troppo.
Riepilogo
Sezione intitolata “Riepilogo”println!stampa con un a capo;print!no.{}e{name}sono segnaposto per valori che sanno mostrarsi conDisplay.format!funziona comeprintln!ma restituisce unaStringinvece di stampare.{:?}(e{:#?}) stampa i valori per il debug, compresi quelli che{}non sa gestire.{:.2}arrotonda i decimali;<,>e^con una larghezza allineano il testo;{{e}}stampano graffe vere.
Verifica veloce
Sezione intitolata “Verifica veloce”Verifica veloce
1. Qual è la differenza tra println! e print!?
2. Perché useresti {:?} invece di {} per stampare una tupla?
Punteggio: 0 / 2
Per approfondire
Sezione intitolata “Per approfondire”std::fmt— documentazione della libreria standard (in inglese): l’elenco completo delle opzioni di formattazione, compresi larghezza, riempimento, allineamento e precisione.- Formatted print — Rust by Example (in inglese): esempi eseguibili di argomenti posizionali e con nome, riempimento e allineamento.
- Debug — Rust by Example (in inglese): come funzionano
{:?}e{:#?}e come li ottengono i tuoi tipi. println!— documentazione della libreria standard (in inglese): il riferimento ufficiale diprintln!, con link aprint!edeprintln!.format!— documentazione della libreria standard (in inglese): costruire unaStringcon le stesse regole di formattazione.