где можно на Box и ссылки, но упёрся в ошибку borrow checker-а:
playground с минимальным примером.
Суть в том, что у структуры Scene есть два вектора объектов dyn Trait (конкретная оболочка мне не важна, как раз меняю с Arc на Box).
При создании новой сцены объекты из первого вектора должны собирать (методом build) новые объекты для второго вектора, которые содержат в себе ссылку на объект, который их собирает. В результате этого некоторые элементы v2 содержат ссылки на v1, одно поле структуры ссылается на другое.
Раньше это работало на std::sync::Weak, а теперь раст жалуется, что структура частично позаимствована (собой же) и не даёт вернуть её из конструктора. Можно ли это как-то исправить?
Ты кладёшь ссылку из структуры обратно в неё, а потом пытаешься переместить эту структуру, тем самым те самые ссылки должны перестать быть действенными, но они в этой самой возвращаемой структуре. Честно говоря Arc хорошо подходит в этом случае, разве что стоит избегать std::sync::Weak если оно ничего тебе особо не даёт, ради производительности.
А можно ли передавать структуру по какому-нибудь указателю, чтобы сама структура не двигалась и ссылки в ней на саму себя оставались действительными?
Есть std::pin::Pin, однако придётся писать unsafe и, вероятно, мучительно постигать Pin
Конкретно в этом примере времена жизни не нужны вообще
Обсуждают сегодня