从具有生命周期的结构切换到特征
Switching from struct with lifetime to trait
我正在尝试创建一个 trait 来将某些内容呈现为 &Strings 上的迭代器。如果我在 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<&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() {
}
rust 抱怨生命周期:
<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())
我应该如何定义 trait 并进行实施以使其发挥作用?
顺便问一下,为什么编译器将此生命周期称为'a?它没有在任何地方命名,通常 rust 符合 "anonymous lifetime"。这是一个应该报告的错误吗?
我们想在我们的 StringList 引用上声明一个新的生命周期,并确保我们的 returned,盒装 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 return 对象,您将看到在该对象上声明了 'a。 Vec 的实现必须将生命周期 'a 引入调用 iter() 时获取的 Vec 引用。
我正在尝试创建一个 trait 来将某些内容呈现为 &Strings 上的迭代器。如果我在 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<&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() {
}
rust 抱怨生命周期:
<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())
我应该如何定义 trait 并进行实施以使其发挥作用?
顺便问一下,为什么编译器将此生命周期称为'a?它没有在任何地方命名,通常 rust 符合 "anonymous lifetime"。这是一个应该报告的错误吗?
我们想在我们的 StringList 引用上声明一个新的生命周期,并确保我们的 returned,盒装 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 return 对象,您将看到在该对象上声明了 'a。 Vec 的实现必须将生命周期 'a 引入调用 iter() 时获取的 Vec 引用。