首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从具有生命周期的结构到特性的转换

从具有生命周期的结构到特性的转换
EN

Stack Overflow用户
提问于 2015-08-01 06:18:05
回答 1查看 225关注 0票数 3

我正在尝试创建一个特性,将某些东西表示为迭代器-Strings。如果我在get_iterator结果中使用struct::片::Iter,一切都正常。

代码语言:javascript
复制
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>

代码语言:javascript
复制
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() {
}

铁锈抱怨生命周期:

代码语言:javascript
复制
<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‘?它在任何地方都没有命名,而且通常是“匿名生命周期”。它是一个应该报告的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-01 08:04:50

我们希望在我们的StringList引用上声明一个新的生命周期,并确保返回的、装箱的Iterator特征受该生命周期的约束。

代码语言:javascript
复制
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”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31758933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档