我试图制作一个特性来呈现作为迭代器和弦乐器的东西。如果我在get_iterator结果中使用struct std :: slice :: Iter,那么每次都可以。
pub trait Value {
fn get_iterator(&self) -> Box<std::slice::Iter<String>>;
}
struct StringList {
strings: Vec<String>
}
impl Value for StringList {
fn get_iterator(&self) -> Box<std::slice::Iter<String>> {
Box::new(self.strings.iter())
}
}
fn main() {
}
但是当我切换到trait Iterator&lt;&amp; String&gt;
pub trait Value {
fn get_iterator(&self) -> Box<Iterator<Item=&String>>;
}
struct StringList {
strings: Vec<String>
}
impl Value for StringList {
fn get_iterator(&self) -> Box<Iterator<Item=&String>> {
Box::new(self.strings.iter())
}
}
fn main() {
}
生锈抱怨生命时间:
<anon>:11:31: 11:37 error: cannot infer an appropriate lifetime for lifetime parameter 'a in function call due to conflicting requirements
<anon>:11 Box::new(self.strings.iter())
我应该如何定义特征并使其实现以使其有效?
顺便说一句,为什么编译器会调用这个生命周期&#39; a?它没有在任何地方命名,通常生锈符合&#34;匿名生命周期&#34;。这是一个应该报告的错误吗?
答案 0 :(得分:2)
我们想在StringList引用上声明一个新的生命周期,并确保我们返回的盒装迭代器特征受到该生命周期的约束。
pub trait Value {
fn get_iterator<'a>(&'a self) -> Box<Iterator<Item=&String> + 'a>;
}
struct StringList {
strings: Vec<String>
}
impl Value for StringList {
fn get_iterator<'a>(&'a self) -> Box<Iterator<Item=&String> + 'a> {
Box::new(self.strings.iter())
}
}
fn main() {
}
修改强> 要回答关于生命周期的问题,实际上已经定义了,但是文档并没有显示出来。单击Vec文档中的Iter返回对象,您将看到在该对象上声明了&#39; a。 Vec的实现必须在调用iter()时为Vec引用引入生命周期&#39;