Size: a a a

Rust — русскоговорящее сообществo

2020 April 11

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
polunin.ai
Значит без структуры Pin у которой unsound дырки есть
Проще поправить косяк в имеющемся пине, чем городить что-то новое (с новыми I-unsound багами)
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Mikail Bagishov
Проще поправить косяк в имеющемся пине, чем городить что-то новое (с новыми I-unsound багами)
Ну на самом деле нужно было сделать чтобы следующий код был валидным:
let data = Pin::new(1);
let link = data.as_ref();
Struct { data, link }
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Если у тебя есть более простое решение для самоссылающихся структур - расскажи, интересно.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Mikail Bagishov
Если у тебя есть более простое решение для самоссылающихся структур - расскажи, интересно.
Переписать борроучекер чтобы вариант выше можно было делать
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
polunin.ai
Ну на самом деле нужно было сделать чтобы следующий код был валидным:
let data = Pin::new(1);
let link = data.as_ref();
Struct { data, link }
А если я хочу брать ссылку на поле напрямую, а не на его дереф?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Pin::new() создаёт объект на хипе и гарантирует что он будет находиться там постоянно. Борроу чекер переписанный видит что link ссылается на объект на хипе.
источник

Э

Эрик in Rust — русскоговорящее сообществo
polunin.ai
Переписать борроучекер чтобы вариант выше можно было делать
А такой вариант - UB.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
polunin.ai
Pin::new() создаёт объект на хипе и гарантирует что он будет находиться там постоянно. Борроу чекер переписанный видит что link ссылается на объект на хипе.
В чем отличие такого Pin::new() от Box::pin()?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
А такой вариант - UB.
Почему?
источник

Э

Эрик in Rust — русскоговорящее сообществo
А, нет, это я под вечер не вижу ничего и ошибся.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Mikail Bagishov
В чем отличие такого Pin::new() от Box::pin()?
Ну или так, без разницы. Суть в том, что компилятор не разрешает в структуру воткнуть ссылку так как мувается data. И компилятор считает что мувается полностью data со всеми полями, хотя мувается на деле только поинтер.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну, выйдет Polonius, будет можно так делать. Или нельзя. Скорее нельзя, потому что Box внутри - Unique. А unique<T> - это PhantomData<T>, и считается как объект, а не указатель.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
polunin.ai
Ну или так, без разницы. Суть в том, что компилятор не разрешает в структуру воткнуть ссылку так как мувается data. И компилятор считает что мувается полностью data со всеми полями, хотя мувается на деле только поинтер.
Я так понимаю, что необходимо и достоточно
PinDeref {
   type Target;    
   fn deref<'a>(&self) -> &'a Target where self: 'a {}
}

(Аналогично PinDerefMut).
Интересно, можно ли такое реализовать
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Mikail Bagishov
Я так понимаю, что необходимо и достоточно
PinDeref {
   type Target;    
   fn deref<'a>(&self) -> &'a Target where self: 'a {}
}

(Аналогично PinDerefMut).
Интересно, можно ли такое реализовать
во всяком случае, такой трейт автоматически решает все проблемы с борровингом содержимого Box-ов
источник

В

Вафель in Rust — русскоговорящее сообществo
Кто в процедурных макросах разбирается, как мне проверить что в syn::ItemImpl self_ty это path::Wrapper<path2::Type> и потом вытащить эти самые path::Wrapper и path2::Type?

А то там такой страшный и вложенный тип получается у self_ty, что я не понимаю как к нему подойти...
источник
2020 April 12

В

Вафель in Rust — русскоговорящее сообществo
(пути я не знаю, но дженерик парараметр должен быть один и задан)
источник

K

Kong Ning Kuan 孔宁宽 in Rust — русскоговорящее сообществo
Подскажите что такое idiomatic rust wrapper?
источник

K

Kong Ning Kuan 孔宁宽 in Rust — русскоговорящее сообществo
ну всмысле идея какая?
источник

K

Kong Ning Kuan 孔宁宽 in Rust — русскоговорящее сообществo
Я хочу сделать враппер вокруг буллета (физики), есть где посты про то, что значит идиоматик и как удобнее сделать враппер?)
источник

В

Вафель in Rust — русскоговорящее сообществo
Не знаю что именно (и где) имеют в виду идеоматичным, но wrapper это обычно просто

struct Wrapper(Type);
источник