R
MaybeUninit<S>Size: a a a
R
MaybeUninit<S>В

Э
R
В
R
r
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) и без forgetR
DefaultВ
match mem::replace(&mut s, Default::default) и без forgettake и было выше собственноR
take().unwrap() самый разумный вариантR
replace явно не подходит. Ты же удалишь значения, пока все не появятсяR
В
Option'ы то вариант @iccsf с mem::take имхо, разумнее. В ином случае — мой вариант с take_mutr
replace явно не подходит. Ты же удалишь значения, пока все не появятсяR
R
R
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,
};
самый легкооптимизируемыйВ
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
В
unsafe прям на месте