Ваша ошибка может быть уменьшена до следующего:
pub struct IdIter(Box<dyn Iterator<Item=()>>);
impl IdIter {
pub fn new<I: Iterator<Item=()>>(tmpl: I) -> Self {
Self(Box::new(tmpl))
}
}
Ошибка выглядит следующим образом:
error[E0310]: the parameter type `I` may not live long enough
--> src/lib.rs:5:14
|
4 | pub fn new<I: Iterator<Item=()>>(tmpl: I) -> Self {
| -- help: consider adding an explicit lifetime bound `I: 'static`...
5 | Self(Box::new(tmpl))
| ^^^^^^^^^^^^^^
|
note: ...so that the type `I` will meet its required lifetime bounds
--> src/lib.rs:5:14
|
5 | Self(Box::new(tmpl))
| ^^^^^^^^^^^^^^
Сначала это неочевидно, но ошибка указывает вам в общем направлении из того, что происходит: Box<dyn Iterator<Item = ()>>
в вашей структуре автоматически Box<dyn Iterator<Item = ()> + 'static>
, в то время как I
не обязательно может быть 'static
.
Решение состоит в том, чтобы ввести новое время жизни:
pub struct IdIter<'a>(Box<dyn Iterator<Item = ()> + 'a>);
impl<'a> IdIter<'a> {
pub fn new<I: Iterator<Item = ()> + 'a>(tmpl: I) -> Self {
Self(Box::new(tmpl))
}
}
Детская площадка