Ce face mem::take
mem::take(&mut loc) este mem::replace(&mut loc, T::default()): returnează valoarea și lasă în urmă una „goală”. Merge cu orice tip care are Default: String, Vec, HashMap, numere, Option (rămâne None).
Este foarte practic pentru a „goli” un buffer și a-i procesa conținutul fără clonare.
Parametri
| Parametru | Descriere |
|---|---|
dest |
Locul din care iei valoarea, prin &mut. |
Ce returnează
Valoarea care era în dest.
Exemple
Exemplul 1: Golirea unui buffer de mesaje
use std::mem;
struct Jurnal {
in_asteptare: Vec<String>,
}
impl Jurnal {
fn scrie(&mut self, m: &str) {
self.in_asteptare.push(m.to_string());
}
fn trimite(&mut self) -> Vec<String> {
mem::take(&mut self.in_asteptare)
}
}
fn main() {
let mut j = Jurnal { in_asteptare: Vec::new() };
j.scrie("utilizator conectat");
j.scrie("comandă plasată");
let trimise = j.trimite();
println!("trimise: {trimise:?}");
println!("rămase: {:?}", j.in_asteptare);
}
Rezultat
trimise: ["utilizator conectat", "comandă plasată"]
rămase: []
Exemplul 2: Valori implicite rămase în urmă
use std::mem;
fn main() {
let mut text = String::from("Bună dimineața");
let mut total: u32 = 250;
let mut oras: Option<&str> = Some("Iași");
println!("{:?} -> rămâne {:?}", mem::take(&mut text), text);
println!("{} -> rămâne {}", mem::take(&mut total), total);
println!("{:?} -> rămâne {:?}", mem::take(&mut oras), oras);
}
Rezultat
"Bună dimineața" -> rămâne ""
250 -> rămâne 0
Some("Iași") -> rămâne None
Greșeli frecvente
- Folosești
mem::takepe un tip fărăDefault: nu compilează. Foloseștemem::replacecu o valoare aleasă de tine. - Pentru
Option,opt.take()face același lucru și este mai citit.
Comenzi înrudite
mem::replace: Pune o valoare nouă într-un loc mutabil și returnează valoarea veche, mutată afară.Option::take: take scoate valoarea și lasă None în loc; replace pune o valoare nouă și o returnează pe cea veche.mem::swap: Schimbă între ele valorile din două locuri mutabile, fără copiere și fără variabilă temporară.