if și else în Rust

Execută un bloc de cod doar dacă o condiție bool este adevărată. În Rust, if este o expresie: poate da o valoare.

Sintaxă
if conditie {
    ...
} else if alta_conditie {
    ...
} else {
    ...
}

let x = if conditie { valoare1 } else { valoare2 };

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ă eroarea if and else have incompatible types.
  • Folosești if ca 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 if care compară aceeași valoare cu constante. match este 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).