【发布时间】:2021-07-16 21:40:57
【问题描述】:
我有一个函数,它获取一些数据的所有权,破坏性地修改它,然后返回它。
fn transform(s: MyData) -> MyData {
todo!()
}
在某些情况下,我有一个&mut MyData 参考。我想申请transform 到&mut MyData。
fn transform_mut(data_ref: &mut MyData) {
*data_ref = transform(*data_ref);
}
但是,这会导致编译器错误。
error[E0507]: cannot move out of `*data_ref` which is behind a mutable reference
--> src/lib.rs:10:27
|
10 | *data_ref = transform(*data_ref);
| ^^^^^^^^^ move occurs because `*data_ref` has type `MyData`, which does not implement the `Copy` trait
我考虑过使用mem::swap 和mem::replace,但它们要求您已经有一些有效值可以放入引用中,然后再取出另一个。
有没有办法做到这一点? MyData 没有合理的默认值或虚拟值来临时存储在引用中。感觉好像是因为我拥有独占访问权限,所以所有者不应该关心转换,但我的直觉可能在这里是错误的。
【问题讨论】:
标签: rust borrow-checker