Rust 如何重用范围以获取阵列的一部分?

Rust 如何重用范围以获取阵列的一部分?,rust,Rust,我正在处理大小不同的数组块3、4、5等: 返回的错误为: 错误[E0277]:未满足特性绑定的`&std::ops::Range:std::slice::SliceIndex` ->src/main.rs:20:29 | 20 | let group_sum:u8=arr[&范围].iter.sum; |^^^^^^^^^^^^^^^^切片索引的类型为“usize”或范围为“usize”` | =help:trait`std::slice::SliceIndex`未为`&std::ops::Ra

我正在处理大小不同的数组块3、4、5等:

返回的错误为:

错误[E0277]:未满足特性绑定的`&std::ops::Range:std::slice::SliceIndex` ->src/main.rs:20:29 | 20 | let group_sum:u8=arr[&范围].iter.sum; |^^^^^^^^^^^^^^^^切片索引的类型为“usize”或范围为“usize”` | =help:trait`std::slice::SliceIndex`未为`&std::ops::Range'实现` =注:由于“[u8]的”std::ops::Index`的impl上的要求,因此需要` 错误[E0277]:未满足特性绑定的`&std::ops::Range:std::slice::SliceIndex` ->src/main.rs:21:26 | 21 |对于idx,在arr[&范围]中的el。iter.enumerate{ |^^^^^^^^^^^^^^^^切片索引的类型为“usize”或范围为“usize”` | =help:trait`std::slice::SliceIndex`未为`&std::ops::Range'实现` =注:由于“[u8]的”std::ops::Index`的impl上的要求,因此需要` 错误[E0277]:未满足特性绑定的`&std::ops::Range:std::slice::SliceIndex` ->src/main.rs:22:13 | 22 |结果[&range][idx]=el*组和*校正[&range][idx]; |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^切片索引的类型为“usize”或范围` | =help:trait`std::slice::SliceIndex`未为`&std::ops::Range'实现` =注:由于“[u8]的”std::ops::Index`的impl上的要求,因此需要` 错误[E0277]:未满足特性绑定的`&std::ops::Range:std::slice::SliceIndex` ->src/main.rs:22:53 | 22 |结果[&range][idx]=el*组和*校正[&range][idx]; |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^` | =help:trait`std::slice::SliceIndex`未为`&std::ops::Range'实现` =注:由于“[u8]的”std::ops::Index`的impl上的要求,因此需要`
使用range而不是&range会导致使用移动值错误。是否可以在不使用range.clone的情况下工作?

否,当前不可能。要传递给切片索引方法的有效值是a.k.a.[]是那些实现trait的类型。Range不在该列表中,尽管我不知道是否有任何技术原因阻止它成为这种情况

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

当你打电话给foo[1..2],您正在将所创建范围的所有权传递到Index::Index,它占用两个usize值。如果我们能够传递一个&Range,我们将只传递一个usize值,但我们必须执行取消引用,然后可能至少复制一个内部usize。我未经验证的假设是,它将比克隆慢无论如何

另见


你真的关心克隆两个整数对性能的影响吗?我希望创建该Vec会对性能产生更大的影响。@Shepmaster问得好。但是如果数组有更多的元素,而我每次迭代都要克隆几次呢?无论如何,我有一些想法,但看起来好像我的担心是错的。
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]
}