我有一个结构体拥有一个实现某些 trait 类型的装箱值。该结构体本身也实现了相同的 trait。我想用一个包装它的新结构体实例替换这个值。
以下代码不能通过编译,应该更清楚地说明了我的意图:
我好奇是否有一种安全的方法来做这件事。
以下代码不能通过编译,应该更清楚地说明了我的意图:
trait T {}
struct S {
t: Box<dyn T>,
}
impl T for S {}
impl S {
fn new(t: Box<dyn T>) -> Self {
Self { t }
}
fn wrap_t(&mut self) {
self.t = Box::new(Self::new(self.t))
}
}
这个操作失败了:
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:14:37
|
14 | self.t = Box::new(Self::new(self.t))
| ^^^^ cannot move out of borrowed content
实现类似这样的wrap_t
确实可以编译:
use std::mem;
fn wrap_t(&mut self) {
unsafe {
let old_t = mem::replace(&mut self.t, mem::uninitialized());
let new_t = Box::new(Self::new(old_t));
let uninit = mem::replace(&mut self.t, new_t);
mem::forget(uninit);
}
}
我好奇是否有一种安全的方法来做这件事。