enum Vector<'a, T: 'a> {
Borrowed(&'a mut [T]),
Owned(Vec<T>),
}
impl<'a, T> Vector<'a, T> {
fn iter(&self) -> impl Iterator<Item = &T> {
match self {
Self::Borrowed(value) => value.iter(),
Self::Owned(value) => value.iter(),
}
}
fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
match self {
Self::Borrowed(value) => value.iter_mut(),
Self::Owned(value) => value.iter_mut(),
}
}
}
fn main() {
// ok
test_simple_vector::run();
// error
test_complex_vector::run();
}
mod test_simple_vector {
use super::*;
type Element = u32;
trait Iterable {
fn iter(&self) -> impl Iterator<Item = &Element>;
fn iter_mut(&mut self) -> impl Iterator<Item = &mut Element>;
}
impl<'a> Iterable for Vector<'a, Element> {
fn iter(&self) -> impl Iterator<Item = &Element> {
self.iter()
}
fn iter_mut(&mut self) -> impl Iterator<Item = &mut Element> {
self.iter_mut()
}
}
fn test_iter<I: Iterable>(i: &I) {
println!("{:?}", i.iter().collect::<Vec<&Element>>());
}
fn test_iter_mut<I: Iterable>(i: &mut I) {
for (index, x) in i.iter_mut().enumerate() {
*x = index as Element + 10;
}
println!("{:?}", i.iter().collect::<Vec<&Element>>());
}
pub(super) fn run() {
let mut v = Vector::Owned(vec![2]);
test_iter(&v);
test_iter_mut(&mut v);
let borrowed_source = &mut [2];
let mut v = Vector::Borrowed(borrowed_source);
test_iter(&v);
test_iter_mut(&mut v);
}
}
mod test_complex_vector {
use super::*;
#[derive(Debug)]
struct Element<'e> {
data: &'e str,
}
trait Iterable {
fn iter(&self) -> impl Iterator<Item = &Element>;
fn iter_mut(&mut self) -> impl Iterator<Item = &mut Element>;
}
impl<'a> Iterable for Vector<'a, Element<'a>> {
fn iter(&self) -> impl Iterator<Item = &Element> {
self.iter()
}
fn iter_mut(&mut self) -> impl Iterator<Item = &mut Element> {
self.iter_mut()
}
}
fn test_iter<I: Iterable>(i: &I) {
println!("{:?}", i.iter().collect::<Vec<&Element>>());
}
fn test_iter_mut<I: Iterable>(i: &mut I) {
for e in i.iter_mut() {
*e = Element{ data: "dummy" };
}
println!("{:?}", i.iter().collect::<Vec<&Element>>());
}
pub(super) fn run() {
let owned_source = vec![Element{ data: "hello" }, Element{ data: "world" }];
let mut v = Vector::Owned(owned_source);
test_iter(&v);
test_iter_mut(&mut v);
let borrowed_source = &mut [Element{ data: "hello" }, Element{ data: "world" }];
let mut v = Vector::Borrowed(borrowed_source);
test_iter(&v);
test_iter_mut(&mut v);
}
}
Errors:
Compiling playground v0.0.1 (/playground)
error: lifetime may not live long enough
--> src/main.rs:87:13
|
85 | impl<'a> Iterable for Vector<'a, Element<'a>> {
| -- lifetime `'a` defined here
86 | fn iter(&self) -> impl Iterator<Item = &Element> {
| - let's call the lifetime of this reference `'1`
87 | self.iter()
| ^^^^^^^^^^^ method was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`
error: lifetime may not live long enough
--> src/main.rs:91:13
|
85 | impl<'a> Iterable for Vector<'a, Element<'a>> {
| -- lifetime `'a` defined here
...
90 | fn iter_mut(&mut self) -> impl Iterator<Item = &mut Element> {
| - let's call the lifetime of this reference `'1`
91 | self.iter_mut()
| ^^^^^^^^^^^^^^^ method was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`
error: could not compile `playground` (bin "playground") due to 2 previous errors