假设我们想在Rust中创建一个slice或vector的迭代器,迭代器从指定索引k处开始,而不是从起始索引0开始。这对于遍历环形缓冲区非常有用。
fn iter_from<T>(slice: &[T], k: usize) -> impl Iterator<Item=&T> {
// todo
}
fn main() {
let array = [0,1,2,3,4,5,6,7,8,9];
for i in iter_from(&array, 5) {
print!("{},", i);
} // 5,6,7,8,9,0,1,2,3,4,
}
fn iter_from<T>(slice: &[T], k: usize) -> impl Iterator<Item=&T> {
slice[k..].iter().chain(slice[..k].iter())
}
fn iter_mut_from<T>(slice: &mut [T], k: usize) -> impl Iterator<Item=&mut T> {
// todo
}
fn iter_mut_from<T>(slice: &mut [T], k: usize) -> impl Iterator<Item=&mut T> {
slice[k..].iter_mut().chain(slice[..k].iter_mut())
}
error[E0499]: cannot borrow `*slice` as mutable more than once at a time
--> src/main.rs:6:33
|
5 | fn iter_mut_from<T>(slice: &mut [T], k: usize) -> impl Iterator<Item=&mut T> {
| - let's call the lifetime of this reference `'1`
6 | slice[k..].iter_mut().chain(slice[..k].iter_mut())
| ----------------------------^^^^^-----------------
| | |
| | second mutable borrow occurs here
| first mutable borrow occurs here
| returning this value requires that `*slice` is borrowed for `'1`
For more information about this error, try `rustc --explain E0499`.
这是因为我们对同一个slice请求了两次可变借用,一次是slice[k..],另一次是slice[..k]。我们知道这两者是互斥的,但是编译器还不够聪明。
pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])
fn iter_mut_from<T>(slice: &mut [T], k: usize) -> impl Iterator<Item=&mut T> {
let (s1, s2) = slice.split_at_mut(k);
s2.iter_mut().chain(s1.iter_mut())
}