如何在&mut T值上调用T-> T函数

时间:2018-12-24 03:43:01

标签: rust borrow-checker ownership

注意:对于首先到达此处的任何人,重复链接的摘要:最佳解决方案是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::uninitializedreplace进行演示:

uninitialized

1 个答案:

答案 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);
}

Playground