Pin::new() создаёт объект на хипе и гарантирует что он будет находиться там постоянно. Борроу чекер переписанный видит что link ссылается на объект на хипе.
Pin::new() создаёт объект на хипе и гарантирует что он будет находиться там постоянно. Борроу чекер переписанный видит что link ссылается на объект на хипе.
Ну или так, без разницы. Суть в том, что компилятор не разрешает в структуру воткнуть ссылку так как мувается data. И компилятор считает что мувается полностью data со всеми полями, хотя мувается на деле только поинтер.
Ну, выйдет Polonius, будет можно так делать. Или нельзя. Скорее нельзя, потому что Box внутри - Unique. А unique<T> - это PhantomData<T>, и считается как объект, а не указатель.
Ну или так, без разницы. Суть в том, что компилятор не разрешает в структуру воткнуть ссылку так как мувается data. И компилятор считает что мувается полностью data со всеми полями, хотя мувается на деле только поинтер.
Я так понимаю, что необходимо и достоточно PinDeref { type Target; fn deref<'a>(&self) -> &'a Target where self: 'a {} }
(Аналогично PinDerefMut). Интересно, можно ли такое реализовать
Кто в процедурных макросах разбирается, как мне проверить что в syn::ItemImplself_ty это path::Wrapper<path2::Type> и потом вытащить эти самые path::Wrapper и path2::Type?
А то там такой страшный и вложенный тип получается у self_ty, что я не понимаю как к нему подойти...