gpt4 book ai didi

rust - 了解循环中的不可变借用

转载 作者:行者123 更新时间:2023-11-29 07:56:48 26 4
gpt4 key购买 nike

我不太明白为什么会这样编译:

fn main() {
let mut v = vec![1,2,3];

for i in 1..v.len() {
v[i] = 20;
}
}

...而这不是:

fn main() {
let mut v = vec![1,2,3];

for (i,_) in v.iter().enumerate() {
v[i] = 20;
}
}

错误:

error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
--> src/main.rs:6:13
|
4 | for (i,_) in v.iter().enumerate() {
| --------------------
| |
| immutable borrow occurs here
| immutable borrow later used here
5 |
6 | v[i] = 20;
| ^ mutable borrow occurs here

在这两种情况下,我们都进行了不可变借用(一种是在调用 len() 时,另一种是在我们调用 iter() 时)。

因此,我的预期是第一个片段不应该编译——当存在不可变借用时,我们在进行赋值时进行可变借用。

我误会了什么?

最佳答案

在第一种情况下,您实际上并不是在进行不可变借用,或者更确切地说,它在调用 len() 之后结束。返回(因为 len 返回一个原始类型,不包含对其使用对象的引用)。这意味着您的循环完全没问题,因为您拥有一个且唯一的可变对象。

在第二个上,您正在创建一个实现 Iterator<Item = &u32> 的类型然后迭代该迭代器。迭代器对你的集合有一个不可变的借用(否则你怎么能在它上面调用 next() 呢?)。这有点隐蔽,但这就是不可变借用的所在,也是你不能做你所做的事情的原因。

通常,在使用迭代器时,以及当您需要修改被迭代的元素时,iter_mut是要走的路,原因很明显:-)

关于rust - 了解循环中的不可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57787483/

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