如何从结构中预定义的"Range"访问切片?

ide*_*n42 2 slice rust

使用切片语法访问切片很简单: slice = vector[i..j]

但是,在存储范围的情况下,我可以告诉您不能这样做:

struct StructWithRange {
    range: std::ops::Range<usize>,
}

fn test_slice(s: &StructWithRange, vector: &Vec<i32>) {
    let slice = &vector[s.range];
    println!("{:?}", slice); // prints [2, 3]
}

fn main() {
    let vector = vec![1,2,3,4,5];
    let s = StructWithRange {
        range: 1..3
    };

    test_slice(&s, &vector);
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:6:25
  |
6 |     let slice = &vector[s.range];
  |                         ^ cannot move out of borrowed content
Run Code Online (Sandbox Code Playgroud)

有没有办法从范围中获取切片而不扩展它?
例如:vector[s.range.start..s.range.end]

如果usize结构中的a可以用于索引查找,为什么不能以Range<usize>相同的方式使用它?

lje*_*drz 5

由于Index是需要以下功能的特性:

fn index(&self, index: Idx) -> &Self::Output
Run Code Online (Sandbox Code Playgroud)

它消耗/移动用于索引(index)的值.在您的情况下,您尝试使用Range从借用的结构索引切片,但由于您只传递引用并且范围未实现Copy,因此失败.

您可以通过例如修复它改变的定义,test_slice消费StructWithRangeclone()荷兰国际集团将s.range在索引中.