分配给借来的变量如何违反引用规则?

时间:2017-09-11 13:54:05

标签: rust borrowing

我有这段代码:

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)。
  3. 我有一个可变变量和一个不可变链接。为什么编译器会出错?

1 个答案:

答案 0 :(得分:3)

The Rust Programming Language, 2nd edition定义the rules of references

  
      
  1. 在任何时候,你可以有以下两种:      
        
    • 一个可变的参考文献。
    •   
    • 任意数量的不可变引用。
    •   
  2.   
  3. 参考文件必须始终有效。
  4.   

隐式地分配给变量需要一个可变引用:

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

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