为什么我可以在不使用不安全代码的情况下获得Rust中变量的多个可变引用?

为什么我可以在不使用不安全代码的情况下获得Rust中变量的多个可变引用?,rust,borrow-checker,Rust,Borrow Checker,我在读铁锈书,上面写着: 在任何给定的时间,可以有一个可变引用,也可以有任意数量的不可变引用 然而,我在试验中发现,我实际上可以在同一范围内拥有多个可变引用,而无需使用任何不安全的代码: fn make_mut(x:&mut i32)->&mut i32{ x } fn main(){ 设muti=1; 设ir=&mut i; 设ir2=make_mut(ir); *ir2=2; println!(“{}”,*ir); } 输出: 2 这是怎么回事?铁锈书是不是把事情简单化了?关于Rust

我在读铁锈书,上面写着:

在任何给定的时间,可以有一个可变引用,也可以有任意数量的不可变引用

然而,我在试验中发现,我实际上可以在同一范围内拥有多个可变引用,而无需使用任何不安全的代码:

fn make_mut(x:&mut i32)->&mut i32{
x
}
fn main(){
设muti=1;
设ir=&mut i;
设ir2=make_mut(ir);
*ir2=2;
println!(“{}”,*ir);
}
输出:

2

这是怎么回事?铁锈书是不是把事情简单化了?关于Rust borrow checker的信息来源是否比Rust book更适合经验不足的Rust程序员?

可变引用是不可复制的,因此在您将
ir
传递到
make_mut
后,它被移动,不再存在:

fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(ir);
    *ir = 3; // error here
    *ir2 = 2;
    println!("{}", *ir);
}
在您的特定情况下,使用
ir
,会发生重新镜像;这就是Rust修改代码的方式:

fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(&mut *ir); // rust replaces raw `ir` with reborrowed mutable reference to dereferenced `ir`
    *ir2 = 2;
    println!("{}", *ir);
}

如果试图同时使用两个可变引用,仍然会出现编译错误。

相同的范围≠ 任何时候都可以。你做了一个错误的假设。另请参见
println!(“{},*ir)不过。它在移动后会进入一种奇怪的半存在状态吗?薛定谔的裁判?我更新了我的答案,解释了一点关于重传的问题。啊,好的,看到你的编辑了。我还没听说过再抢劫。你知道我在哪里可以读到更多关于它的信息吗?我在铁锈书的第19章,我不认为有人提到过它。好吧,对于以后阅读这本书的人来说,这个问题可能会有所帮助:这只是铁锈的一个小把戏:每个可变引用都被视为
&mut*my_mut_ref
。但它只适用于确切的类型。因此,如果您有任何通用的
&mut T
,那么如果您尝试使用该可变引用,则不会发生重新加载。