Внутри дропа действия производятся лишь над одним полем. Однако этот самый дроп не даёт мне возможность дестрастрактить структуру. Что я могу в данном случае сделать ? К примеру (сори, если поляна) :
use std::fs::File;
struct SomeStruct {
file: File,
useful_data: Vec<u8>,
}
impl Drop for SomeStruct {
fn drop(&mut self) {
self.file.flush();
// <- useful data remains untouched.
}
}
fn main() {
let some_struct = SomeStruct {
file: std::fs::File::open("file.txt").unwrap(),
useful_data: vec![1, 2, 3, 4, 5],
};
let SomeStruct { file, useful_data } = some_struct;
}
error[E0509]: cannot move out of type `SomeStruct, which implements the Drop trait`
Обычный дестракчр паттерн.
Распаковка структуры на поля
Это называется деструктурирование. Создаются локальные переменные file и useful_data со значениями соответсвующих полей структуры. Структура при этом дропается и больше недоступна
Круто, спасибо )
https://doc.rust-lang.org/rust-by-example/flow_control/match/destructuring.html
ну тут другой пример на структуре, такие я видел и раньше
Просто немного запутанно выглядело, как будто мы объявили структуру через let (что???) и потом ей еще присвоили такой же экземпляр этой структуры )))
Это если some_struct имеет тип SomeStruct. А если это &SomeStruct/&mut SomeStruct, то file и useful_data будут ссылками на поля some_struct
Так, окей, я рановато обрадовался. Это первая половина. Но что, если у меня поле в структуре - не Option<T> ?
Не туда ответил, кажется
Ну в данном конкретном примере можно через ManuallyDrop+ptr::read. Или даже просто сделать mem::take(&mut some_struct.usefull_data)
Обсуждают сегодня