繁体   English   中英

从迭代器返回切片时无法推断适当的生命周期

[英]Cannot infer an appropriate lifetime when returning a slice from an iterator

我有一个带有简单struct Point {x: f32, y: f32, z: f32}Vec<Point> 我的向量在3D中代表成千上万的线(实际上可能是Vec<Vec<Point>> ),因此我跟踪所有线的开始/结束。

pub struct Streamlines {
    lengths: Vec<usize>,
    offsets: Vec<usize>,  // cumulative sum of lengths
    data: Vec<Point>,
}

我想为其创建一个非消耗迭代器,其用法如下:

for streamline in &streamlines {
    for point in &streamline {
        println!("{} {} {}", point.x, point.y, point.z);
    }
    println!("")
}

我发现了如何为一个简单的结构实现Iterator和IntoIterator? 并开始copyi-err,进行调整:)

impl IntoIterator for Streamlines {
    type Item = &[Point];
    type IntoIter = StreamlinesIterator;

    fn into_iter(self) -> Self::IntoIter {
        StreamlinesIterator {
            streamlines: self,
            it_idx: 0
        }
    }
}

struct StreamlinesIterator {
    streamlines: &Streamlines,
    it_idx: usize
}

impl Iterator for StreamlinesIterator {
    type Item = &[Point];

    fn next(&mut self) -> Option<&[Point]> {
        if self.it_idx < self.streamlines.lengths.len() {
            let start = self.streamlines.offsets[self.it_idx];
            self.it_idx += 1;
            let end = self.streamlines.offsets[self.it_idx];

            Some(self.streamlines.data[start..end])
        }
        else {
            None
        }
    }
}

我使用切片是因为我只想返回向量的一部分,然后由于需要而添加了生存期,但是cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements ,现在我有此错误cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements

实际上,我实际上不知道我在做什么该死的<'a>

由于需求冲突,无法为通用类型的生命周期参数推断适当的生命周期

那是因为您没有正确实现Iterator并具有以下内容:

impl<'a> Iterator for StreamlinesIterator<'a> {
    type Item = &'a [Point];

    fn next(&mut self) -> Option<&[Point]> { /* ... */ }

    // ...
}

由于生命周期推断,这等效于:

impl<'a> Iterator for StreamlinesIterator<'a> {
    type Item = &'a [Point];

    fn next<'b>(&'b mut self) -> Option<&'b [Point]> { /* ... */ }

    // ...
}

这是尝试返回一个与迭代器一样长的引用, 而您不能这样做

如果您正确实现Iterator ,那么它可以工作:

impl<'a> Iterator for StreamlinesIterator<'a> {
    type Item = &'a [Point];

    fn next(&mut self) -> Option<&'a [Point]> { /* ... */ }

    // Even better:   
    fn next(&mut self) -> Option<Self::Item> { /* ... */ }

    // ...
}

我实际上不知道我在做什么该死的<'a>

您应该返回并重新阅读Rust编程语言 ,第二版 当您有特定问题(堆栈溢出,IRC),用户论坛时,都将处于等待状态。

暂无
暂无

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

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