Конец значения и трейт Drop в Rust
Когда имя выходит из области видимости, компилятор обычно освобождает память и вызывает код очистки для типа. Для своих структур можно задать дополнительный шаг: трейт конца с методом, который получает изменяемую ссылку на значение перед уничтожением.
Такой метод не нужно вызывать вручную в обычном коде: его подставляет компилятор в момент, когда значение больше не живет. Удобно печатать отладочное сообщение, закрывать ресурс или снимать регистрацию в учебном примере.
Добавим трейт конца к простой структуре:
struct Gate {
name: &'static str,
}
impl Drop for Gate {
fn drop(&mut self) {
println!("end {}", self.name);
}
}
fn main() {
let g = Gate { name: "main" };
println!("work");
}
Сначала напечатается "work", затем
строка с "end main", когда g
заканчивается в конце main.
Внутренний блок тоже завершает значение раньше, чем вся функция:
struct Gate {
tag: i32,
}
impl Drop for Gate {
fn drop(&mut self) {
println!("end {}", self.tag);
}
}
fn main() {
{
let inner = Gate { tag: 2 };
println!("block");
}
println!("after");
}
Дана структура:
struct Note {
text: &'static str,
}
Реализуйте трейт конца, который печатает
text, создайте значение в
main и убедитесь, что сообщение
идет после последней строки функции.
Дано число:
let num = 9;
Оберните литерал в структуру с одним
полем, в drop выведите поле и
положите значение во внутренний блок,
чтобы увидеть конец до строки после блока.
Скажите, когда компилятор вызывает метод трейта конца относительно выхода имени из области видимости.