// 要实现迭代的数据
#[derive(Debug)]
struct MyData<T> {
data: Vec<T>,
}
// 引用的迭代器创建
impl<'a, T> IntoIterator for &'a MyData<T> {
// 返回的是引用
type Item = &'a T;
// 实际的迭代器对象
type IntoIter = MyDataIter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
MyDataIter { index: self.data.len(), data: self }
}
}
/// 引用迭代器
/// 保存的是数据的引用
struct MyDataIter<'a, T: 'a> {
index: usize,
data: &'a MyData<T>,
}
/// 实现迭代器
impl<'a, T> Iterator for MyDataIter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if self.index == 0 {
return None;
}
self.index -= 1;
self.data.data.get(self.index)
}
}
impl<'a, T> IntoIterator for &'a mut MyData<T> {
type Item = &'a mut T;
type IntoIter = MyDataIterMut<'a, T>;
fn into_iter(self) -> Self::IntoIter {
MyDataIterMut { index: self.data.len(), data: self }
}
}
struct MyDataIterMut<'a, T: 'a> {
index: usize,
data: &'a mut MyData<T>,
}
impl<'a, T> Iterator for MyDataIterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
if self.index == 0 {
return None;
}
self.index -= 1;
// 这儿必须用指标实现.
unsafe {
let ptr = self.data.data.as_mut_ptr().add(self.index);
Some(&mut *ptr)
}
}
}
fn main() {
let v1 = vec![11, 12, 13];
let mut item = MyData { data: v1 };
for x in &mut item {
*x += 10;
println!("{}", x);
}
println!("item is {:?}", item);
}