gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:00:39 31 4
gpt4 key购买 nike

我正在尝试创建一个 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 遵守“匿名生命周期”。这是一个应该报告的错误吗?

最佳答案

我们想在我们的 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 的实现必须将生命周期 'a 引入调用 iter() 时获取的 Vec 引用。

关于struct - 从具有生命周期的结构切换到特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758933/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com