使用切片语法访问切片很简单: 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>相同的方式使用它?
由于Index是需要以下功能的特性:
fn index(&self, index: Idx) -> &Self::Output
Run Code Online (Sandbox Code Playgroud)
它消耗/移动用于索引(index)的值.在您的情况下,您尝试使用Range从借用的结构索引切片,但由于您只传递引用并且范围未实现Copy,因此失败.
您可以通过例如修复它改变的定义,test_slice消费StructWithRange或clone()荷兰国际集团将s.range在索引中.