我正在试图找出以下代码无法编译的原因。
期望的行为是:给定一个整数向量,找到它的最大值,并将一个最大值+ 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
评论的行中结束?
答案 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
};
如果你愿意的话。