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

Добрый день. Я хочу сделать Итератор вокруг BTreeMap по мутабельным значениям

этой коллекции, для которого время от времени область итерирования можно будет пересоздавать на месте.

Для этих целей Итератор должен одновременно владеть как RangeMut объектом, так и мутабельной ссылкой на исходный BTreeMap, что невозможно. По этой причине я решил хранить raw pointer на RangeMut для целей пересоздания RangeMut объекта.

Вот прототип имплементации: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=afbf07c393477d66c7c94b345e1aa90b

Прокомментируйте, пожалуйста, моё решение на предмет безопасности.

9 ответов

14 просмотров

ну смотри самое простое.. *mut может быть null, а может и нет, раст это проверяет при обращении по нему, и может это свернуть, а может и нет.. не даром придумали NonNull далее.. определять порядок дропа в целом по идее и не нужно, так как не особо думаю важно убивать первее bar или baz ведь он указатель, но как опционально в таких случаях ManuallyDrop (два, с нужным порядком в общем drop) далее... всеже проставь вручную лайфтаймы особенно на iter.. я не прослеживал что за лайфтайм там раст выведет но навсякий.. далее. ты используешь указатели, хотя могбы и ссылки(вариант очень вычурнее, но по итогу без массового unsafe) просто при условии что ты приведешь ее к лайфтайму на new и далеедалее... глянул бегло, могу что-то и забыть..

Ilya-Lakhin Автор вопроса
Денис Котляров
ну смотри самое простое.. *mut может быть null, а...

Спасибо за подробный комментарий. 1) Foo не владеет баром, он владеет мутабельной ссылок на внешний объект. Поэтому проблемы с дропом здесь не должно возникать, как я понимаю. 2) Лайфтаймы у меня вроде все проставлены. 3) Если это можно на обычных ссылках сделать, как именно?

Ilya Lakhin
Спасибо за подробный комментарий. 1) Foo не владе...

а NonNull им и не владеет. внутри NonNull тотже *const а создается NonNull от *mut.

Ilya-Lakhin Автор вопроса
Денис Котляров
а NonNull им и не владеет. внутри NonNull тотже *c...

Я, честно говоря, вообще не понял, зачем мне NonNull?

Ilya Lakhin
Я, честно говоря, вообще не понял, зачем мне NonNu...

затем что ты сделал из & который не является null то что может являтся null а это *const/*mut тоесть ты на типах потерял эту особенность и сделал так что любая разыменовка *const/*mut ведет к дополнительным проверкам + у тебя во втором поле option, а оно там надо? судя по iter оно там не надо)

Денис Котляров
ну смотри самое простое.. *mut может быть null, а...

Не проверяет, просто Option<raw ptr> будет больше по размеру, чем Option<NonNull>

разве там нет оптимизации, когда ptr.is_null(), то Option<ptr> == None ?

Ned Ogl
разве там нет оптимизации, когда ptr.is_null(), то...

Нет, в нём нет ниши, равной 0, Option<ptr> семантически как Option<Option<NonNull>>

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта