Popravde mam pocit, ze pouziti poli bude asi dost omezene, mozna to tak vyzaduje prekladac, aby vzdycke presne znal delku. Jestli to chapu dobre z tutorialu, tak vektory (vec!) jsou alokovany na heapu a jsou menitelne (pridani prvku napriklad). U poli by me asi vadila ta divna inicializace pres unsafe - to nejde nejak obejit (potom by to bylo ok)?
neni nekde prehledne porovnani array s vec?
V Rustu je podmínka pro alokování na stacku že datový typ musí mít známou velikost, array tohle splňuje. Alokovat na heapu se dá pomocí Boxu ( Box::new([0; 10])
), takže alokace na stacku není podmínkou. Data vektoru jsou vždy na heapu.
Vec má dynamickou velikost, array fixní. Kde se krásně setkávají jsou právě ty řezy (slice): řez na Vec je stejný typ jako řez na array.
fn increment_all(slice: &mut [i32]) {
for i in slice.iter_mut() {
*i += 1;
}
}
fn main() {
let mut array = [0, 1, 2, 3];
let mut vec: Vec<_> = (0..4).collect();
increment_all(&mut array);
increment_all(&mut vec);
println!("{:?}", array); // [1, 2, 3, 4]
println!("{:?}", vec); // [1, 2, 3, 4]
}
Ohledně toho unsafe, Rust považuje neinicializovanou paměť za unsafe a nedá se vytvořit array s neinicializovanými prvky bez unsafe bloku.