我试图弄清楚为什么下面的代码不能编译.
期望的行为是:给定整数向量,找到其最大值并将最大值+ 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?
你错过了一个小细节,即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)
如果你愿意的话.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |