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ă
draincopiază 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.