我正在尝试创建一个特性,将某些东西表示为迭代器-Strings。如果我在get_iterator结果中使用struct::片::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() {
}但当我转到特质Iterator<&String>
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())我应该如何定义特性并使其实现以使其发挥作用?
顺便问一句,为什么编译器称这个生命周期为'a‘?它在任何地方都没有命名,而且通常是“匿名生命周期”。它是一个应该报告的错误吗?
发布于 2015-08-01 08:04:50
我们希望在我们的StringList引用上声明一个新的生命周期,并确保返回的、装箱的Iterator特征受该生命周期的约束。
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() {
}编辑:回答您关于生存期'a‘的问题,它实际上是定义的,但是文档没有显示它。单击Vec文档中的Iter返回对象,您将看到'a是在该对象上声明的。Vec的实现将不得不向调用iter()时使用的Vec引用引入生存期“a”。
https://stackoverflow.com/questions/31758933
复制相似问题