注意:对于首先到达此处的任何人,重复链接的摘要:最佳解决方案是this one,它说明了如何使用replace
和{ {1}},并且还放置了uninitialized
以避免未初始化的数据丢失时的UB,并且take_mut
crate包含一个forget
函数,可以很好地将其包装起来,因此您不必不必自己编写任何不安全的代码。
我有take
和一个值fn f(x: T) -> T
。编写p: &mut T
有什么技巧吗?我有一个使用*p = f(*p)
的解决方案,如果mem::replace
具有默认值,则可以使用该解决方案,并且我可以使用T
将其推广为任何类型,但这确实很棘手,我希望有一个安全的方法防锈替代品。
以下是如何使用mem::uninitialized
和replace
进行演示:
uninitialized
答案 0 :(得分:0)
有三个数据处理案例:
克隆是关于创建重复项,以便能够独立使用原始值和新值
搬家与所有权转移有关,因为不再需要原始变量
借用是为了在可控制的时间内临时借出参考,以便能够在借贷之前和之后使用原始变量(如果借用&而不借用&mut,
由于f
函数要取得所有权( moving ),并假设您没有机会将其更改为参考(借用),因此最好在foo
函数内部克隆参考值,因为否则会将变量从不安全的借用内容中移出。
我建议以下内容:
fn foo<T>(p: &mut T)
where
T: Clone,
{
// let old = mem::replace(p, unsafe {mem::uninitialized()});
let old = p.clone();
*p = f::<T>(old);
}