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

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

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

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

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

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

9 ответов

2 просмотра

ну смотри самое простое.. *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>>

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
How to create an OS in C? what to study?
Linus
18
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта