Size: a a a

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

2020 August 19

К

Кирилл in Rust — русскоговорящее сообществo
Вафель
swap у тебя просто меняет переменные a и derefed местами
То есть, то, что лежит под мютексом не затрагивается. Понял.
Так, всё-таки, есть ли решение у этой задачи без Box?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Кирилл
То есть, то, что лежит под мютексом не затрагивается. Понял.
Так, всё-таки, есть ли решение у этой задачи без Box?
Есть. Берёшь parking_lot::Mutex или Rwlock, они инлайнятся. А вот dyn Trait в боксу суёшь.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну, то есть, нет решения без того чтобы боксить dyn trait, можно только не боксить мутекс.
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Кирилл
То есть, то, что лежит под мютексом не затрагивается. Понял.
Так, всё-таки, есть ли решение у этой задачи без Box?
Мне кажется, это можно было бы реализовать, просто нужен swap_unsized<T: !Sized>, но такого нет, насколько я вижу по доке стд
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
Мне кажется, это можно было бы реализовать, просто нужен swap_unsized<T: !Sized>, но такого нет, насколько я вижу по доке стд
Ну просто его невозможно будет реализовать (also, нельзя делать !Sized баунд).

Чтобы сделать такой свап тебе нужен доступ к контейнеру
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Вафель
Ну просто его невозможно будет реализовать (also, нельзя делать !Sized баунд).

Чтобы сделать такой свап тебе нужен доступ к контейнеру
Его можно реализовать на уровне компилятора)
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
Его можно реализовать на уровне компилятора)
Как ты отличишь &mut полученную из Arc и из Box?) это один и тот-же тип
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Вафель
Как ты отличишь &mut полученную из Arc и из Box?) это один и тот-же тип
А зачем отличать?
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
А зачем отличать?
Потому что тебе нужно изменить *const T который в них лежит
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Кстати, <*mut T>::swap where T: ?Sized :)
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Вафель
Потому что тебе нужно изменить *const T который в них лежит
*mut T
Ну так, а в чём проблема? По факту, нужно отличать T: Sized и T: !Sized, и с каждым из них понятно, что делать?
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
Кстати, <*mut T>::swap where T: ?Sized :)
Это бага в растдоке, если что
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Блин, я щас понял, что можно сделать свап безопасно, только если size_of::<dyn Tr> == size_of::<dyn Tr>
источник

r

red75prime in Rust — русскоговорящее сообществo
Andrey Vlasov
Мне кажется, это можно было бы реализовать, просто нужен swap_unsized<T: !Sized>, но такого нет, насколько я вижу по доке стд
А что оно должно будет делать? Просто менять местами толстые указатели? Это делается через swap(&mut fat_ptr1, &mut fat_ptr2). Менять местами данные разного размера? Как? Паниковать если размеры разные?
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
red75prime
А что оно должно будет делать? Просто менять местами толстые указатели? Это делается через swap(&mut fat_ptr1, &mut fat_ptr2). Менять местами данные разного размера? Как? Паниковать если размеры разные?
Согласен, никак
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Вафель
Это бага в растдоке, если что
Игрушка дьявола......
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
*mut T
Ну так, а в чём проблема? По факту, нужно отличать T: Sized и T: !Sized, и с каждым из них понятно, что делать?
У тебя есть Box<T> (T: !Sized) ты через DerefMut получаешь &mut T. Чтобы поменять то что находится в Box'е тебе нужно изменить размер внутри толстого указателя в боксе, но ты ничего про бокс не знаешь, у тебя просто &mut T
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Кирилл
То есть, то, что лежит под мютексом не затрагивается. Понял.
Так, всё-таки, есть ли решение у этой задачи без Box?
Крч, принципиально нельзя свапать ?Sized вещи
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Вафель
У тебя есть Box<T> (T: !Sized) ты через DerefMut получаешь &mut T. Чтобы поменять то что находится в Box'е тебе нужно изменить размер внутри толстого указателя в боксе, но ты ничего про бокс не знаешь, у тебя просто &mut T
Да, я ошибся
источник

m

mAX in Rust — русскоговорящее сообществo
Товарищи, помогите пожалуйста найти красивое решение
Допустим есть структура
struct S1 {
   a: Option<u64>,
   b: Option<u64>,
   c: Option<u64>,
}
с несколькими Option<> элементами.. нужно их вытащить (take()) их все сразу если они все что-то содержат, иначе оставить как есть..
не хотелось бы копировать лишний  раз

пример моего текущего решения вот такой
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aabb2e9a98ec16e147bace2f84789cc4

интересно есть ли возможность сделать это как-то короче без копирования элементов, лишних проверок и тд?
источник