Всем доброго времени суток. Есть структура, у которой заимплеменчен дроп.

Внутри дропа действия производятся лишь над одним полем. Однако этот самый дроп не даёт мне возможность дестрастрактить структуру. Что я могу в данном случае сделать ? К примеру (сори, если поляна) :
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`

11 ответов

7 просмотров
Lighty- Автор вопроса

Обычный дестракчр паттерн.

Распаковка структуры на поля

Это называется деструктурирование. Создаются локальные переменные 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

Lighty- Автор вопроса

Так, окей, я рановато обрадовался. Это первая половина. Но что, если у меня поле в структуре - не Option<T> ?

Не туда ответил, кажется

Ну в данном конкретном примере можно через ManuallyDrop+ptr::read. Или даже просто сделать mem::take(&mut some_struct.usefull_data)

Похожие вопросы

Обсуждают сегодня

а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Мне вот что интересно, кто на рфе стартовал/играл, что вы фармили, в каком виде контента он прямо хорош? Экспедиция? Вроде прямо на замазанных мапах рф сдувается
Владислав
20
Подскажите где можно прочитать про реализацию возможности писать человеку при подписке на телеграм канал от имени бота? Было бы не плохо если для Telegraf@3.38.0
Pan Lipton
10
‌/r/pathofexile moderation changes top scoring links : pathofexile (RSS) Hi, everyone. On behalf of the subreddit mod team, I’m here to give you a few updates on the subreddi...
Esionru
3
У меня вопрос к знающими, стоит ли вступать в гильдии в игре или лучше полная свобода?
Енот Полоскун
17
У вас бывает ощущение, что хочется потратить весь отпуск на то, чтоб только спать?
Николай
15
Как можно настроить фильтр в пое под себя?
Yarik yarik kyda ti lezesh
15
Кто нибудь поясните это всё таки вброс или да? Про санктум слышал на поедб вбросили, а по дурке откуда инфа и на сколько это вообще правда? Пахнет шизофренией какой-то ✅Divi...
Dmitry Ritter
9
Всем привет, может уже кто-то пытался выдернуть из api информацию о дате рождения пользователя Есть ли вообще такая возможность?
Artem Stormageddon
2
Ребят, есть какие нибудь мили билды, способные в шмотках с пола закрывать атлас?
Ninja Obormot
12
Карта сайта