gpt4 book ai didi

rust - 如何重用范围来获取数组的一部分?

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

我正在处理不同大小(3、4、5 等) block 中的数组 (link to the playground):

fn main() {
let arr: [u8; 10] = [
1, 1, 1,
2, 2, 2,
3, 3, 3, 0
];
let mut results: [u8; 10] = [0; 10];
let corrections: [u8; 10] = [
1, 1, 1,
1, 1, 1,
1, 1, 1, 0
];
let group_ranges = vec![
0..3,
3..6,
6..10
];

for range in group_ranges {
let group_sum: u8 = arr[&range].iter().sum();
for (idx, el) in arr[&range].iter().enumerate() {
results[&range][idx] = el * group_sum * corrections[&range][idx];
}
}
println!("{:?}", results);
// => [3, 3, 3, 12, 12, 12, 27, 27, 27, 0]
}

返回的错误:

error[E0277]: the trait bound `&std::ops::Range<{integer}>: std::slice::SliceIndex<[u8]>` is not satisfied
--> src/main.rs:20:29
|
20 | let group_sum: u8 = arr[&range].iter().sum();
| ^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `&std::ops::Range<{integer}>`
= note: required because of the requirements on the impl of `std::ops::Index<&std::ops::Range<{integer}>>` for `[u8]`

error[E0277]: the trait bound `&std::ops::Range<{integer}>: std::slice::SliceIndex<[u8]>` is not satisfied
--> src/main.rs:21:26
|
21 | for (idx, el) in arr[&range].iter().enumerate() {
| ^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `&std::ops::Range<{integer}>`
= note: required because of the requirements on the impl of `std::ops::Index<&std::ops::Range<{integer}>>` for `[u8]`

error[E0277]: the trait bound `&std::ops::Range<{integer}>: std::slice::SliceIndex<[u8]>` is not satisfied
--> src/main.rs:22:13
|
22 | results[&range][idx] = el * group_sum * corrections[&range][idx];
| ^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `&std::ops::Range<{integer}>`
= note: required because of the requirements on the impl of `std::ops::Index<&std::ops::Range<{integer}>>` for `[u8]`

error[E0277]: the trait bound `&std::ops::Range<{integer}>: std::slice::SliceIndex<[u8]>` is not satisfied
--> src/main.rs:22:53
|
22 | results[&range][idx] = el * group_sum * corrections[&range][idx];
| ^^^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `&std::ops::Range<{integer}>`
= note: required because of the requirements on the impl of `std::ops::Index<&std::ops::Range<{integer}>>` for `[u8]`

使用 range 而不是 &range 会产生 use of moved value 错误。是否可以在不使用 range.clone() 的情况下工作?

最佳答案

不,目前不可能。传递给切片的有效值 index方法(又名 [] )是那些实现 SliceIndex 的类型特征。 &Range不在该列表中,尽管我不知道是否有任何技术原因阻止它出现。

关于克隆在这种情况下的性能的旁白......

当您调用 foo[1..2] 时,您正在传递创建的 Range<usize> 的所有权进入Index::index , 占用两个 usize值。如果我们能够传入 &Range ,我们只会传递一个 usize值得,但我们必须执行取消引用,然后可能至少复制一个内部 usize无论如何。我的(未经检验的)假设是无论如何它都会比克隆慢。

另见

关于rust - 如何重用范围来获取数组的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48670109/

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