Vec::fill în Rust

Scrie aceeași valoare în toate pozițiile vectorului (sau ale unei bucăți din el), fără să schimbe lungimea.

Sintaxă
pub fn fill(&mut self, value: T)   // T: Clone

Ce face Vec::fill

fill(valoare) înlocuiește fiecare element cu o copie a valorii date. Lungimea rămâne aceeași. Metoda vine de la slice-uri, deci o poți aplica și pe o bucată: v[2..5].fill(0) umple doar pozițiile 2, 3 și 4.

Valoarea trebuie să implementeze Clone. Pentru valori calculate pentru fiecare poziție există fill_with(|| ...).

Parametri

Parametru Descriere
value Valoarea scrisă în fiecare poziție.

Ce returnează

Nimic.

Exemple

Exemplul 1: Resetare și umplerea unei bucăți

fn main() {
    let mut scoruri = vec![12, 7, 30, 4, 18];
    scoruri.fill(0);
    println!("{:?}", scoruri);

    let mut rand = vec!['.'; 8];
    rand[2..5].fill('#');
    println!("{}", rand.iter().collect::<String>());
}

Rezultat

[0, 0, 0, 0, 0]
..###...

Exemplul 2: Program săptămânal și fill_with

fn main() {
    let mut program = vec![String::new(); 5];
    program.fill(String::from("liber"));
    program[1..3].fill(String::from("ocupat"));
    println!("{:?}", program);

    let mut n = 0;
    let mut numere = vec![0; 5];
    numere.fill_with(|| {
        n += 10;
        n
    });
    println!("{:?}", numere);
}

Rezultat

["liber", "ocupat", "ocupat", "liber", "liber"]
[10, 20, 30, 40, 50]

Greșeli frecvente

  • Te aștepți ca fill să adauge elemente într-un vector gol. Un vector gol rămâne gol; pentru lungime nouă folosește resize sau vec![valoare; n].
  • Scrii v[2..10].fill(0) pe un vector mai scurt de 10: panic pentru interval invalid.

Comenzi înrudite

  • Vec::resize: Schimbă lungimea vectorului: îl taie dacă e prea lung sau adaugă copii ale unei valori până la noua lungime.
  • Vec: Vectorul dinamic din Rust: o listă de elemente de același tip, ținute unul după altul în memorie, care crește singură.
  • Vec::iter: Cele trei moduri de a parcurge un vector: iter dă referințe, iter_mut dă referințe mutabile, into_iter dă elementele.