繁体   English   中英

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

[英]Switching from struct with lifetime to trait

我正在尝试制作一个特性来呈现作为迭代器和字符串的东西。 如果我在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() {
}

生锈抱怨生命:

<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? 它没有在任何地方命名,通常生锈符合“匿名生命”。 这是一个应该报告的错误吗?

我们想在StringList引用上声明一个新的生命周期,并确保我们返回的盒装迭代器特征受该生命周期的约束。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM