String::drain în Rust

String Rust 1.6

Scoate din String bucata dintr-un interval de octeți și o returnează ca iterator de caractere.

Sintaxă
pub fn drain<R>(&mut self, range: R) -> Drain<'_>
where R: RangeBounds<usize>

Ce face String::drain

drain(a..b) taie octeții de la a la b din text și îți dă caracterele scoase sub formă de iterator. Le poți strânge într-un String nou cu collect(). Capetele intervalului trebuie să fie granițe de caractere.

Bucata este scoasă din textul original chiar dacă nu parcurgi iteratorul. Pentru a tăia textul în două la o poziție folosește split_off; pentru a înlocui bucata cu alt text, replace_range.

Parametri

Parametru Descriere
range Intervalul de octeți: 2..5, ..3 (de la început), 4.. (până la final), .. (tot).

Ce returnează

Un iterator Drain care produce caracterele (char) scoase.

Exemple

Exemplul 1: Mutarea prefixului într-un String separat

fn main() {
    let mut s = String::from("ERR: fișierul lipsește");
    let poz = s.find(": ").unwrap() + 2;
    let prefix: String = s.drain(..poz).collect();
    println!("prefix: {prefix:?}");
    println!("mesaj:  {s:?}");
}

Rezultat

prefix: "ERR: "
mesaj:  "fișierul lipsește"

Exemplul 2: Golirea întregului text, caracter cu caracter

fn main() {
    let mut s = String::from("ață");
    for c in s.drain(..) {
        let n = c.len_utf8();
        println!("{c}: {n} {}", if n == 1 { "octet" } else { "octeți" });
    }
    println!("după drain: {:?}", s);
}

Rezultat

a: 1 octet
ț: 2 octeți
ă: 2 octeți
după drain: ""

Greșeli frecvente

  • Crezi că drain copiază bucata. O scoate din textul original.

Comenzi înrudite

  • String::split_off: Taie String-ul în două la poziția at (octeți): returnează partea a doua, iar originalul păstrează prima parte.
  • String::replace_range: Înlocuiește pe loc bucata dintr-un interval de octeți cu alt text (de orice lungime).
  • String::remove: Scoate caracterul de la poziția idx (în octeți) și îl returnează; restul textului se mută la stânga.
  • String::truncate: Scurtează textul la primii new_len octeți; nu face nimic dacă textul e deja mai scurt.