Hlavní navigace

Vlákno názorů k článku Práce s poli v programovacím jazyku Rust od pole nebo vektory? - Popravde mam pocit, ze pouziti poli bude asi...

  • Článek je starý, nové názory již nelze přidávat.
  • 2. 2. 2017 12:03

    pole nebo vektory? (neregistrovaný)

    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?

  • 2. 2. 2017 23:18

    85127a9c (neregistrovaný)

    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.