【问题标题】:Lifetime in Iterator: fn next(&'a mut self)迭代器中的生命周期:fn next(&'a mut self)
【发布时间】:2016-03-22 12:20:45
【问题描述】:
struct Person<T> {
    letter: Letter<T>
}

struct Letter<T> {
    words: [Option<T>; 5]
}

struct EditIter<'a, T: 'a> {
    letter: &'a mut Letter<T>
}
impl<'a, T: 'a> Iterator for EditIter<'a, T> {
    type Item = Mode<'a, T>;
    fn next(&mut self) -> Option<Self::Item> {
        /* ... */
        Some(Mode::Editing(self.letter))
    }
}

enum Mode<'a, T: 'a> {
    Editing(&'a Letter<T>),
    Speaking(&'a Letter<T>)
}

错误:

src/temp.rs:16:28: 16:39 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements [E0495]
src/temp.rs:16         Some(Mode::Editing(self.letter))
                                          ^~~~~~~~~~~
src/temp.rs:14:5: 17:6 help: consider using an explicit lifetime parameter as shown: fn next(&'a mut self) -> Option<Self::Item>
src/temp.rs:14     fn next(&mut self) -> Option<Self::Item> {
src/temp.rs:15         /* ... */
src/temp.rs:16         Some(Mode::Editing(self.letter))
src/temp.rs:17     }

Person 拥有Letter,Person 将Letter 的可变借用转移到EditIter,EditIter 用借用的Letter 创建一个Mode 并发送它。如果您删除 Iterator 特征并按照错误消息中的说明进行操作,它可以工作,但这不会实现 Iterator 特征。

如何保存逻辑并修复错误?

【问题讨论】:

    标签: iterator rust lifetime


    【解决方案1】:

    由于您的 Mode 不需要可变引用,因此从 EditIter 中删除 mut 即可:

    struct Person<T> {
        letter: Letter<T>,
    }
    
    struct Letter<T> {
        words: [Option<T>; 5],
    }
    
    struct EditIter<'a, T: 'a> {
        letter: &'a Letter<T>,
    }
    
    impl<'a, T: 'a> Iterator for EditIter<'a, T> {
        type Item = Mode<'a, T>;
    
        fn next(&mut self) -> Option<Self::Item> {
            Some(Mode::Editing(self.letter))
        }
    }
    
    enum Mode<'a, T: 'a> {
        Editing(&'a Letter<T>),
        Speaking(&'a Letter<T>),
    }
    

    【讨论】:

    • EditIter 应该能够更改Letter。 (例如,words)。 Mode - 外部 API 的组件。 Letter 有一些公共方法。
    • @nujemid 我不知道该告诉你什么。根据您在问题中提供的MCVE 和描述性文本,代码会根据我所做的更改进行编译和运行。
    • @nujemid:那么...可能是您的 MCVE 不是 C(完整)?你有更多我们做的上下文(显然),我们无法从你的脑海中窥探它,所以请在示例代码中包含所有必要的细节。
    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多