简体   繁体   English

迭代器的生命周期:fn next(&'a mut self)

[英]Lifetime in Iterator: fn next(&'a mut self)

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>)
}

Error: 错误:

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 owns the Letter , Person transfers a mutable borrow of Letter to EditIter , EditIter creates a Mode with the borrowed Letter and sends it. Person拥有该LetterPerson将可变借入的Letter转移给EditIterEditIter使用借来的Letter创建一个Mode并发送它。 If you remove the Iterator trait and do as written in the error message, it works, but this would not implement the Iterator trait. 如果删除Iterator特征并按照错误消息中的说明执行操作,则可以正常工作,但这不会实现Iterator特征。

How can I save the logic and fix the error? 如何保存逻辑并修复错误?

Since your Mode doesn't have any need for a mutable reference, remove the mut from EditIter and it will work: 由于您的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>),
}

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

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