是否有一些不安全的方法来获取包含值的所有权以便改变它?

时间:2017-09-16 19:31:29

标签: rust unsafe borrow-checker

我有一个容器的可变引用,我想修改它的一个内部值:

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块对我们没有任何作用。有没有办法实现这一点,安全与否,消除了临时价值分配?如果没有,编译器是否至少足够聪明才能跳过它?

0 个答案:

没有答案