Size: a a a

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

2020 August 19

R

Roman in Rust — русскоговорящее сообществo
Надо тогда уж сначала сунуть в MaybeUninit<S>
источник

В

Вафель in Rust — русскоговорящее сообществo
меня чертовски бесит эта ошибка, но она есть
источник

Э

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

R

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

В

Вафель in Rust — русскоговорящее сообществo
Roman
Может. Я же не деструктивно
а, справедливо
источник

R

Roman in Rust — русскоговорящее сообществo
Я матчу ссылку, а не значение
источник

r

red75prime in Rust — русскоговорящее сообществo
Roman
use std::{mem::forget, ptr::read};
let fields = match &mut s {
 S { a: Some(a), b: Some(b), c: Some(c) } => unsafe {
   let fields = Some((read(a), read(b), read(c)));
   forget(s);
   Some(fields)
 },
 _ => None,
};
Можно match mem::replace(&mut s, Default::default) и без forget
источник

R

Roman in Rust — русскоговорящее сообществo
Это тогда нужен Default
источник

В

Вафель in Rust — русскоговорящее сообществo
red75prime
Можно match mem::replace(&mut s, Default::default) и без forget
это take и было выше собственно
источник

R

Roman in Rust — русскоговорящее сообществo
Но вообще вроде как чекнуть и потом take().unwrap() самый разумный вариант
источник

R

Roman in Rust — русскоговорящее сообществo
С replace явно не подходит. Ты же удалишь значения, пока все не появятся
источник

R

Roman in Rust — русскоговорящее сообществo
А надо не трогать
источник

В

Вафель in Rust — русскоговорящее сообществo
Если там одни Option'ы то вариант @iccsf с mem::take имхо, разумнее. В ином случае — мой вариант с take_mut
источник

r

red75prime in Rust — русскоговорящее сообществo
Roman
С replace явно не подходит. Ты же удалишь значения, пока все не появятся
Можно обратно вставить. Но оптимизируется это плохо, насколько я помню
источник

R

Roman in Rust — русскоговорящее сообществo
Думаешь, заоптимайзится?
источник

R

Roman in Rust — русскоговорящее сообществo
Во-во
источник

R

Roman in Rust — русскоговорящее сообществo
ИМХО, наивный вариант

let fields = match &s {
 S { a: Some(_), b: Some(_), c: Some(_) => {
   Some((s.a.take().unwrap(), s.b.take().unwap(), s.c.take().unwrap()))
 }
 _ => None,
};

самый легкооптимизируемый
источник

В

Вафель in Rust — русскоговорящее сообществo
Roman
ИМХО, наивный вариант

let fields = match &s {
 S { a: Some(_), b: Some(_), c: Some(_) => {
   Some((s.a.take().unwrap(), s.b.take().unwap(), s.c.take().unwrap()))
 }
 _ => None,
};

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

EG

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

В

Вафель in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Если не выоптимизируется, можно её руками выоптимизировать же
ну это уже unsafe прям на месте
источник