gpt4 book ai didi

rust - 借用的值不应该在表达式后结束吗?

转载 作者:行者123 更新时间:2023-11-29 08:02:06 24 4
gpt4 key购买 nike

我想弄清楚为什么以下代码无法编译。

期望的行为是:给定一个整数向量,找到它的最大值并将最大值 + 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 注释的行结束吗?

最佳答案

您遗漏了一个小细节,即 gv 的类型(因此 greatest_value)是 &i32,而不是 i32,所以 greatest_value 持有对 vector 的引用。

你会想做的

greatest_value = *gv;

只存储数值。

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

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

但是实际上,您可以通过以下方式稍微简化您的代码

let greatest_value = *vector.iter().max().unwrap();

如果你愿意的话。

关于rust - 借用的值不应该在表达式后结束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48711405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com