2

我有这个代码:

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)。

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

4

1 回答 1

6

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;
}
于 2017-09-11T14:09:43.960 回答