Ce face if și else
if verifică o condiție de tip bool și execută blocul dintre acolade dacă este true. Parantezele în jurul condiției nu sunt necesare (și compilatorul te avertizează dacă le pui), dar acoladele sunt obligatorii, chiar și pentru o singură instrucțiune.
else if adaugă alte condiții, verificate în ordine, iar else prinde restul cazurilor. Condiția trebuie să fie exact bool: if n cu n număr nu se compilează.
if este o expresie: let mesaj = if nota >= 5 { "admis" } else { "respins" };. Atunci ambele ramuri trebuie să dea valori de același tip, iar else este obligatoriu. Rust nu are operatorul ternar ? :; această formă îl înlocuiește.
Exemple
Exemplul 1: Mai multe ramuri
Condițiile sunt verificate de sus în jos și se execută doar prima ramură adevărată.
fn calificativ(media: f64) -> &'static str {
if media >= 9.0 {
"Foarte bine"
} else if media >= 7.0 {
"Bine"
} else if media >= 5.0 {
"Suficient"
} else {
"Insuficient"
}
}
fn main() {
for media in [9.5, 7.25, 5.0, 4.5] {
println!("{media}: {}", calificativ(media));
}
}
Rezultat
9.5: Foarte bine
7.25: Bine
5: Suficient
4.5: Insuficient
Exemplul 2: if ca expresie
Valoarea lui if este atribuită direct variabilei. Ambele ramuri dau un u32.
fn main() {
let cos = 135;
let transport = if cos >= 150 { 0 } else { 15 };
println!("Coș: {cos} lei, transport: {transport} lei, total: {} lei", cos + transport);
}
Rezultat
Coș: 135 lei, transport: 15 lei, total: 150 lei
Exemplul 3: Condiția trebuie să fie bool
În C, if (stoc) înseamnă „dacă stocul nu este 0”. Rust cere o comparație explicită: if stoc > 0.
fn main() {
let stoc = 3;
if stoc {
println!("Produs disponibil");
}
}
Mesajul compilatorului (programul nu se compilează)
error[E0308]: mismatched types
--> main.rs:3:8
|
3 | if stoc {
| ^^^^ expected `bool`, found integer
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.
Greșeli frecvente
- Ramurile dau tipuri diferite:
if x { 1 } else { "unu" }dă eroareaif and else have incompatible types. - Folosești
ifca expresie fărăelse:let x = if a { 5 };. Fărăelse, expresia are tipul()și nu se poate atribui unui număr. - Pui
;după valoarea dintr-o ramură ({ 0; }): ramura dă atunci(), nu numărul. - Scrii un lanț lung de
else ifcare compară aceeași valoare cu constante.matcheste mai clar și verifică dacă ai acoperit toate cazurile.
Comenzi înrudite
match: Compară o valoare cu o listă de tipare și execută ramura primului care se potrivește. Compilatorul verifică dacă toate cazurile sunt tratate.if let și let else: if let execută un bloc doar dacă o valoare se potrivește cu un tipar; let else desface valoarea sau iese imediat din funcție.loop, break și continue: loop repetă un bloc la nesfârșit până la un break; break poate returna o valoare, iar continue sare la pasul următor al buclei.tipuri scalare (întregi, f64, bool, char): Tipurile de bază ale lui Rust: întregi cu și fără semn, numere cu virgulă, bool (true/false) și char (un caracter Unicode).