借用变量赋值如何违反引用规则?

3
我有这段代码:
struct Foo<'a> {
    link: &'a i32,
}

fn main() {
    let mut x = 33;
    println!("x:{}", x);
    let ff = Foo { link: &x };
    x = 22;
}

这会导致编译器出现错误:

error[E0506]: cannot assign to `x` because it is borrowed
 --> src/main.rs:9:5
  |
8 |     let ff = Foo { link: &x };
  |                           - borrow of `x` occurs here
9 |     x = 22;
  |     ^^^^^^ assignment to borrowed `x` occurs here

Rust书籍只有两个规则:

  1. 一个或多个对资源的引用(&T
  2. 恰好一个可变引用(&mut T)。

我有一个可变变量和一个不可变链接。为什么编译器会报错?

1个回答

7

Rust编程语言定义了引用规则

  • 在任何时候,你只能有一个可变引用或任意数量的不可变引用。
  • 引用必须始终有效。

隐式重新分配变量需要一个可变引用:

fn main() {
    let mut x = 33;
    let link = &x;
    x = 22;
    *(&mut x) = 22; // Basically the same thing
}

重要的是,重新分配变量会 改变 变量,这会导致 link不可变 引用的值发生变化,这是不允许的。

请注意,变量的初始赋值 不需要 使变量可变:

fn main() {
    let x;
    // Some other code
    x = 42;
}

是否有官方文档或教程说明将值分配给变量隐式地需要可变引用? - Kun
@Kun,我已经澄清了措辞;它实际上是重新分配,这应该更明显地表明了对值的突变。否则,据我所知没有其他的方式。一般来说,许多人都认为这是不言自明的。 - Shepmaster
谢谢!我认为禁止改变/重新分配借用变量的所有者(可变或不可变借用)是有意义的,只是希望在 Rust 书中有更好的文档记录。 - Kun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接