从具有生命周期的结构切换到特征

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 引用。