[英]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
拥有该Letter
, Person
将可变借入的Letter
转移给EditIter
, EditIter
使用借来的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.