tuple (tupluri) în Rust

Grupează un număr fix de valori, de tipuri diferite, într-o singură valoare. Elementele se citesc cu .0, .1 sau prin desfacere.

Sintaxă
let t: (Tip1, Tip2, Tip3) = (a, b, c);
t.0  t.1  t.2               // accesul după poziție
let (x, y, z) = t;           // desfacere
()                           // tuplul gol, tipul „unit”

Ce face tuple (tupluri)

Un tuplu adună câteva valori, posibil de tipuri diferite: ("Ana", 17, 9.5) are tipul (&str, i32, f64). Numărul de elemente este fix și face parte din tip.

Elementele se citesc după poziție, cu t.0, t.1 etc., sau se desfac într-un let: let (nume, varsta, media) = t;. Un element de care nu ai nevoie se ignoră cu _.

Tuplurile sunt utile pentru a returna mai multe valori dintr-o funcție. Tuplul gol () se numește „unit” și este ce returnează funcțiile fără ->. Pentru date cu mai mult înțeles, un struct cu câmpuri numite este mai clar.

Exemple

Exemplul 1: Creare, acces după poziție și desfacere

{:?} afișează tot tuplul. Desfacerea dă nume elementelor, iar _ ignoră vârsta.

fn main() {
    let elev = ("Ana Popescu", 17, 9.45);
    println!("{:?}", elev);
    println!("Nume: {}, media: {}", elev.0, elev.2);

    let (nume, _, media) = elev;
    println!("{nume} are media {media}");
}

Rezultat

("Ana Popescu", 17, 9.45)
Nume: Ana Popescu, media: 9.45
Ana Popescu are media 9.45

Exemplul 2: Un vector de tupluri

Fiecare element este o pereche (oraș, temperatură). În for, perechea este desfăcută direct. Sortarea după al doilea element folosește t.1.

fn main() {
    let mut orase = vec![("Iași", 21), ("Cluj", 18), ("Constanța", 24)];
    orase.sort_by_key(|t| t.1);
    for (oras, grade) in &orase {
        println!("{oras:<10} {grade}°C");
    }
}

Rezultat

Cluj       18°C
Iași       21°C
Constanța  24°C

Greșeli frecvente

  • Scrii (5) crezând că este un tuplu cu un element. Este doar numărul 5 între paranteze; tuplul cu un element se scrie (5,).
  • Accesezi elementele cu un indice calculat (t[i] sau t.i). Pozițiile unui tuplu trebuie scrise direct (t.0), pentru că fiecare poate avea alt tip. Pentru acces după indice folosește un array sau un Vec.
  • Folosești tupluri mari ((String, u32, f64, bool, String)) prin tot programul. Nimeni nu mai știe ce înseamnă t.3; definește un struct.

Comenzi înrudite

  • array ([T; N]): Un șir de lungime fixă, cunoscută la compilare, cu elemente de același tip, păstrat direct pe stivă.
  • struct: Definește un tip nou care grupează mai multe valori cu nume (câmpuri), de exemplu un elev cu nume, clasă și medie.
  • pattern matching (tipare): Tiparele descriu forma unei valori și scot din ea părțile de care ai nevoie: în let, match, if let, for și parametrii funcțiilor.
  • fn: Declară o funcție. Tipul fiecărui parametru este obligatoriu, iar ultima expresie fără punct și virgulă este valoarea returnată.