为什么我们可以将可变引用转换为不可变引用?

问题描述 投票:0回答:1

来自铁锈书

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

考虑以下代码:

fn main() {
    let mut a = 41;
    let b = &mut a;
    let c: &i32 = &a; // [1]
    let d: &i32 = &b;

    println!("{} {}", b, c); // [2]
    println!("{} {}", b, d);
}

如果我们尝试编译,我们会得到:

error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
  --> src\main.rs:43:19
   |
42 |     let b = &mut a;
   |             ------ mutable borrow occurs here
43 |     let c: &i32 = &a; // [1]
   |                   ^^ immutable borrow occurs here
44 |     let d: &i32 = &b;
   |                   -- mutable borrow later used here

...所以,只有一个可变引用的规则得到了检验。

但是,如果您对标记为

[1]
[2]
的行进行注释,则一切都可以正常编译。请注意,在这种情况下
b
是可变引用,
d
是不可变引用(似乎与
c
相同)。

为什么我们允许这种情况以及为什么这种情况下编译时不会违反有关具有一个可变引用或 n 个不可变引用的规则?

rust reference borrow-checker mutable-reference
1个回答
0
投票

不同之处在于,

c
尝试从
a
借用,但这不起作用,因为它已经被
b
借用了,但是
d
b
借用(而不是从a
借用),目前在 
a
 上保留借用,这是完全可以的,在 
a
 上没有借用。只要 
b
 是借用的,你就不能用它来变异 
a

规则并没有被破坏,因为

d

 没有从 
a
 借用。

© www.soinside.com 2019 - 2024. All rights reserved.