gpt4 book ai didi

rust - 为什么我可以将项目推送到我正在使用 while 循环迭代的 Vec 中,但不能使用 for 循环?

转载 作者:行者123 更新时间:2023-12-03 11:28:52 26 4
gpt4 key购买 nike

就像下面的 Rust 代码:while循环编译并运行良好,但是 for iter由于错误,版本无法编译:

error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
--> src/main.rs:22:9
|
20 | for i in v.iter() {
| --------
| |
| immutable borrow occurs here
| immutable borrow later used here
21 | println!("v[i]: {}", i);
22 | v.push(20);
| ^^^^^^^^^^ mutable borrow occurs here

error: aborting due to previous error

但据了解,while Loop也有同样的场景,lenget也一成不变地借用,为什么它不与 push 冲突作为可变借用?我的理解有哪些不足,请指教,非常感谢您的启发!

fn main() {
let mut v = Vec::new();

v.push(1);
v.push(2);
v.push(3);
v.push(4);

let mut i = 0;

while i < v.len() && i < 10 {
v.push(20);
println!("v[i]: {:?}", v.get(i));
i += 1;
}

// for i in v.iter() {
// println!("v[i]: {}", i);
// v.push(20);
// }
}

最佳答案

代码的 for 版本大致相当于以下内容:

fn main() {
let mut v = Vec::new();
v.push(1);
v.push(2);
v.push(3);
v.push(4);

let mut it = v.iter();
while let Some(i) = it.next() {
println!("v[i]: {}", i);
v.push(20);
}
}

Playground

如果你尝试编译它,你会得到一个错误,这可能更有意义:

error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
--> src/main.rs:11:9
|
8 | let mut it = v.iter();
| - immutable borrow occurs here
9 | while let Some(i) = it.next() {
| -- immutable borrow later used here
10 | println!("v[i]: {}", i);
11 | v.push(20);
| ^^^^^^^^^^ mutable borrow occurs here

迭代器在整个循环期间不可变地借用 v,因此您不能在循环内进行任何可变借用。

当然,即使您可以做到这一点,您最终也会陷入无限循环,因为您不断附加另一个项目。

关于rust - 为什么我可以将项目推送到我正在使用 while 循环迭代的 Vec 中,但不能使用 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63525783/

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