要回答我以前的问题之一(How to implement a generic trait with a generic type implementing Iterator?), 这段代码是给我的:
pub trait Vector {
type Item;
type Iter: Iterator<Item = Self::Item>;
// several functions
fn iter(&self) -> Self::Iter;
}
pub struct VectorImplementation1<T> {
numbers: Vec<T>,
}
impl<'a, T> Vector for &'a VectorImplementation1<T> {
type Item = &'a T;
type Iter = std::slice::Iter<'a, T>;
fn iter(&self) -> Self::Iter {
self.numbers.iter()
}
}
fn main() {}
我看到trait是为引用struct而实现的,如果仅使用struct则无法编译。有人可以解释为什么吗?
答案 0 :(得分:0)
如编译器错误所提到的,这里的问题是生存期inline
的实现没有理由:
'a
impl<'a, T> Vector for VectorImplementation1<T> {
/**/
}
因为在这种情况下,编译器仅查看定义,而不查看主体。以下是一种不同的方法,为简单起见,之前可能没有提到:
error[E0207]: the lifetime parameter `'a` is not constrained by the impl
trait, self type, or predicates
--> src/main.rs:13:6
|
13 | impl<'a, T> Vector for VectorImplementation1<T> {
| ^^ unconstrained lifetime parameter
在这种情况下,我们将生存期移至特征,以便该特征可以“使用”生存期,从而验证我们对特征实现的使用。但是,正如我前面提到的那样,这增加了需要了解与该特征相关的生存期的复杂性,从而降低了可读性。