表达后不应该借用价值结束吗?

Gui*_*the 2 rust

我试图弄清楚为什么下面的代码不能编译.

期望的行为是:给定整数向量,找到其最大值并将最大值+ 1的值推送到同一向量上.

fn main() {
    let mut vector = vec![1, 3, 2];
    let greatest_value;
    { // 1
        let mut gv = &vector[0]; // 2
        for x in &vector {
            if x > gv {
                gv = x;
            }
        }
        greatest_value = gv;
    } // 3
    vector.push(greatest_value + 1);
    println!("O maior é: {}", greatest_value);
}
Run Code Online (Sandbox Code Playgroud)

细腻的部分是类中的push方法Vec需要一个可变的借用来修改自我实例vector.编译器看到我在注释的行中进行了一次不可变借用 // 2:

error[E0502]: cannot borrow `vector` as mutable because it is also borrowed as immutable
  --> src/main.rs:13:5
   |
5  |         let mut gv = &vector[0]; // 2
   |                       ------ immutable borrow occurs here
...
13 |     vector.push(greatest_value + 1);
   |     ^^^^^^ mutable borrow occurs here
14 |     println!("O maior é: {}", greatest_value);
15 | }
   | - immutable borrow ends here
Run Code Online (Sandbox Code Playgroud)

那个借款是否应该在评论线上结束// 3

log*_*yth 8

你错过了一个小细节,即gv(因此greatest_value)的类型&i32不是i32,因此greatest_value持有一个引用vector.

你会想做的

greatest_value = *gv;
Run Code Online (Sandbox Code Playgroud)

只存储数值.

您还可以简化逻辑,以避免需要以未经初始化的方式保留变量,这有助于提高可读性,例如

let greatest_value = {
    let mut gv = &vector[0];
    for x in &vector {
        if x > gv {
            gv = x;
        }
    }
    *gv
};
Run Code Online (Sandbox Code Playgroud)

但实际上,您可以稍微简化一下代码

let greatest_value = *vector.iter().max().unwrap();
Run Code Online (Sandbox Code Playgroud)

如果你愿意的话.

  • 如果`Vec`为空,则没有`max`,因此在这种情况下它将返回`None`.你的`vector [0]`会以同样的方式恐慌,但你假设它总是至少有一个. (4认同)