172 похожих чатов

Всем хи, мальчики ❤️ Написал я значит такой код: use bumpalo::{boxed::Box, Bump}; #[derive(Debug)] enum

List<'a, T> {
Empty,
More(T, &'a List<'a, T>),
}

fn make_list<'l>(bump: &'l Bump) -> List<'l, Box<'l, HeapAllocString>> {
let empty = List::Empty;
let l0 = List::More(
Box::new_in(HeapAllocString::new("lol"), bump),
bump.alloc(empty),
);

let l1 = List::More(
Box::new_in(HeapAllocString::new("kek"), bump),
bump.alloc(l0),
);

let l2 = List::More(
Box::new_in(HeapAllocString::new("foo"), bump),
bump.alloc(l1),
);

l2
}

#[derive(Debug)]
struct HeapAllocString(String);

impl HeapAllocString {
fn new(s: &str) -> Self {
Self(String::from(s))
}
}

impl Drop for HeapAllocString {
fn drop(&mut self) {
println!("free the memory ({}) :klass:", &self.0);
}
}

fn main() {
let bump = Bump::new();
let ls = make_list(&bump);
println!("{ls:?}");
}

Хочу написать список, при этом чтобы был женеричный по T и при этом чтобы опционально я мог аллоцировать в нём объекты в куче. Впринципе, всё классно работает, так я могу выделить Box и отдельно на него взять ссылку и сконструировать свой список.
Но вот проблема, такую структуру в расте не вернуть из функции (как минимум нужны самореферентные типы). Поэтому я подумал, ладно, что если я передам в функцию аллокатор?
fn make_list<'l>(bump: &'l Bump) -> List<'l, Box<'l, HeapAllocString>> {/***/}

Работает по такому принципу и я могу возвращать список из функции. Но, так как я использую Bump аллокатор, у него проблема, что он не вызывает Drop для типов. Для этого нужно использовать бумапочный Box. Ну вот я его заюзал и..
More(HeapAllocString("foo"), More(HeapAllocString("kek"), More(HeapAllocString("lol"), Empty)))
free the memory (foo) :klass:

После запуска этого кода я вижу, что только самый верхнеуровнеый Box был дропнут. То есть вложенные Box списка он не дропает.
Так вот, я задумался, а есть ли подобный аллокатор, но чтобы как-то трекал отдельно типы, что нужно дропать?

8 ответов

26 просмотров

Храни в enum List сразу Box<T>

Nano- Автор вопроса
mental stability🥺✨
Храни в enum List сразу Box<T>

В том и задача, я хочу опционально боксить

Nano- Автор вопроса
mental stability🥺✨
И как ты это представляешь?

Выделять память в другом месте и делать список из ссылок

Nano- Автор вопроса
Timur Tugushev
Ну тогда можно сделать энам

Ну да... Но, это рантайм. Хотелось бы на типах чисто

Nano
Ну да... Но, это рантайм. Хотелось бы на типах чис...

Frunk есть с его hlist-ами Очень похоже на тот велосипед с empty и more

Выкинь каку

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта