我有一个容器的可变引用,我想修改它的一个内部值:
struct BigContainer {
contained: BigUint,
}
fn double(container: &mut BigContainer) {
container.contained = container.contained * 2_usize;
}
BigUint
没有实现MulAssign
,因此我们无法使用*=
运算符。因此,写入的代码失败,因为Mul
取得了值的所有权;我们需要暂时摆脱借来的内容。 (playground)
我们可以通过初始化临时值并使用std::mem::replace
来解决这个问题:(playground)
fn double(container: &mut BigContainer) {
let prev_value = mem::replace(&mut container.contained, 0_usize.into());
container.contained = prev_value * 2_usize;
}
这很有效,但它有点难看,我们需要创建那个毫无意义的填充值来暂时保持我们的位置。我想要的是一种不安全的方法,它让我只是覆盖借用检查器。不幸的是,以下内容不起作用:(playground)
fn double(container: &mut BigContainer) {
unsafe {
container.contained = container.contained * 2_usize;
}
}
在这种情况下,unsafe
块对我们没有任何作用。有没有办法实现这一点,安全与否,消除了临时价值分配?如果没有,编译器是否至少足够聪明才能跳过它?