gpt4 book ai didi

rust - 在可变地迭代数组的同时访问数组

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

免责声明:我是 Rust 的新手。

简化用例

根据我目前阅读的有关 Rust 的最佳实践,我了解到使用 for elem in array {} 进行迭代优于 for i in 0..array.len() {}

有没有什么方法可以可变地迭代数组,同时通过索引访问数组中的特定元素?

我的用例很复杂,所以我写了一个简单的斐波那契计算器来演示这个问题:

let mut arr = vec![0;10];

arr[0] = 1;
arr[1] = 1;

for (i, elem) in arr.iter_mut().skip(2).enumerate() {
*elem = arr[i-2] + arr[i-1];
}

println!("{:?}", arr);

error[E0502]: cannot borrow arr as immutable because it is also borrowed as mutable

当然这是有道理的,但有没有办法解决这个问题?我的意思是,从程序员的角度来看,这段代码显然是安全的,因为我们从当前上下文中已有的数组中借用了不可变元素作为可变元素,只是不是直接借用,而是通过迭代器借用。

当然,如果我通过遍历索引来实现它,它就可以工作:

let mut arr = vec![0;10];

arr[0] = 1;
arr[1] = 1;

for i in 2..arr.len(){
arr[i] = arr[i-2] + arr[i-1];
}

println!("{:?}", arr);

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

所以,我的问题是,是否有另一种方法可以解决这个问题,还是我必须使用第二个版本?


真实用例

此代码用于演示我的用例,它本身不执行任何操作。

let mut labels = vec![vec![0; width]; height];

for (y, row) in labels.iter_mut().enumerate() {
for (x, label) in row.iter_mut().enumerate() {
let label_left = {
if x > 0 && some_condition() {
Some(labels[y][x - 1]) // <== Fails
} else {
None
}
};

let label_top = {
if y > 0 && some_condition() {
Some(labels[y - 1][x]) // <== Fails
} else {
None
}
};

*label = some_function(label_left, label_right);
}
}

用基于 2D 索引的迭代重写它感觉很像我试图将 C 编程风格强加到 Rust 中,所以我不敢相信这是预期的方式。

最佳答案

实现简化用例的更“功能”的方法可能是:

fn main() {
let mut arr = vec![0; 10];

arr[0] = 1;
arr[1] = 1;

let arr: Vec<i32> = arr
.iter()
.skip(2)
.scan((arr[0], arr[1]), |pair, _| {
let (a, b) = *pair;
let c = a + b;
*pair = (b, c);

Some(c)
})
.collect();

println!("{:?}", arr);
}

但这不一定比用索引迭代更生疏或更容易阅读。也就是说,如果您愿意进入 FP 兔子洞,那将是非常有益的。

关于rust - 在可变地迭代数组的同时访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57638096/

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