Ce face array ([T; N])
Un array are tipul [T; N]: N elemente de tipul T. Lungimea face parte din tip, deci [i32; 3] și [i32; 4] sunt tipuri diferite și un array nu poate crește. Când ai nevoie de o listă care crește, folosește Vec.
[valoare; N] creează un array cu N copii ale aceleiași valori. Indicii încep de la 0. Fiecare acces a[i] este verificat: un indice în afara array-ului oprește programul cu panică, nu citește memorie străină ca în C.
Un array se poate parcurge cu for x in a (după valoare) sau for x in &a (prin referință) și are toate metodele unui slice: len, contains, iter, sort.
Exemple
Exemplul 1: Creare, acces și parcurgere
zile are 7 elemente, deci tipul lui este [&str; 7]. [0; 7] creează un array de 7 zerouri care apoi este completat.
fn main() {
let zile = ["Lu", "Ma", "Mi", "Jo", "Vi", "Sâ", "Du"];
let mut vanzari = [0; 7];
vanzari[0] = 12;
vanzari[4] = 30;
vanzari[5] = 41;
println!("Prima zi: {}, ultima: {}", zile[0], zile[zile.len() - 1]);
for i in 0..zile.len() {
if vanzari[i] > 0 {
println!("{}: {} produse", zile[i], vanzari[i]);
}
}
println!("Total: {}", vanzari.iter().sum::<i32>());
}
Rezultat
Prima zi: Lu, ultima: Du
Lu: 12 produse
Vi: 30 produse
Sâ: 41 produse
Total: 83
Exemplul 2: Array bidimensional
Un array de array-uri: 3 rânduri a câte 3 elemente. Este folosit aici pentru o tablă de X și O.
fn main() {
let mut tabla = [['.'; 3]; 3];
tabla[0][0] = 'X';
tabla[1][1] = 'O';
tabla[2][2] = 'X';
for rand in &tabla {
let text: String = rand.iter().collect();
println!("{text}");
}
}
Rezultat
X..
.O.
..X
Exemplul 3: Indice în afara array-ului
Indicele 7 nu există într-un array cu 7 elemente (indicii merg de la 0 la 6). Rust verifică accesul și oprește programul cu un mesaj clar.
fn vanzari_in_ziua(vanzari: [i32; 7], zi: usize) -> i32 {
vanzari[zi]
}
fn main() {
let vanzari = [12, 0, 5, 0, 30, 41, 8];
println!("Ziua 6: {}", vanzari_in_ziua(vanzari, 6));
println!("Ziua 7: {}", vanzari_in_ziua(vanzari, 7));
}
Rezultat (programul se oprește cu panică)
Ziua 6: 8
thread 'main' (14470534) panicked at main.rs:2:5:
index out of bounds: the len is 7 but the index is 7
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Greșeli frecvente
- Încerci să adaugi elemente (
a.push(5)). Un array are lungime fixă; foloseșteVec. - Folosești o variabilă pentru lungime:
let n = 5; let a = [0; n];nu se compilează. Lungimea trebuie să fie o constantă (const N: usize = 5;); pentru lungimi aflate la rulare foloseștevec![0; n]. - Folosești
a[i]cândipoate fi în afara array-ului. Metodaa.get(i)returneazăOption(Noneîn loc de panică).
Comenzi înrudite
slice-uri (&[T] și &str): O „fereastră” spre o parte dintr-un array, Vec sau text: o referință care știe de unde începe și câte elemente are, fără să copieze nimic.tuple (tupluri): Grupează un număr fix de valori, de tipuri diferite, într-o singură valoare. Elementele se citesc cu .0, .1 sau prin desfacere.for … in: Parcurge pe rând fiecare element al unui interval, al unei colecții sau al unui iterator.vec!: Creează un Vec cu elementele date, sau cu n copii ale aceleiași valori, într-o singură expresie.