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

时间:2018-02-09 17:45:07

标签: 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);
}

精巧的部分是来自Vec类的push方法需要一个可变的借用来修改自我实例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

借用是否应该在与// 3评论的行中结束?

1 个答案:

答案 0 :(得分:8)

您遗漏了一个小细节,即gv(因此greatest_value)的类型为&i32,而不是i32,因此{{1} }正在引用greatest_value

你想做

vector

只存储数值。

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

greatest_value = *gv;

但实际上,您可以使用

简化代码
let greatest_value = {
    let mut gv = &vector[0];
    for x in &vector {
        if x > gv {
            gv = x;
        }
    }
    *gv
};

如果你愿意的话。