Я внедрял связанные списки, используя слишком много связанных списков. При попытке реализовать iter_mut()
я сделал это сам и сделал следующий код:
type Link<T> = Option<Box<Node<T>>>;
pub struct List<T> {
head: Link<T>
}
struct Node<T> {
elem: T,
next: Link<T>
}
impl<T> List<T> {
pub fn iter_mut(&mut self) -> IterMut<T> {
IterMut::<T>(&mut self.head)
}
}
pub struct IterMut<'a, T>(&'a mut Link<T>);
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next<'b>(&'b mut self) -> Option<&'a mut T> {
self.0.as_mut().map(|node| {
self.0 = &mut (**node).next;
&mut (**node).elem
})
}
}
Я избегаю приведения и опущения, потому что ясность позволяет мне понять больше.
Ошибка:
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/third.rs:24:16
|
24 | self.0.as_mut().map(|node| {
| ^^^^^^
|
note: first, the lifetime cannot outlive the lifetime `'b` as defined on the method body at 23:13...
--> src/third.rs:23:13
|
23 | fn next<'b>(&'b mut self) -> Option<&'a mut T> {
| ^^
note: ...so that reference does not outlive borrowed content
--> src/third.rs:24:9
|
24 | self.0.as_mut().map(|node| {
| ^^^^^^
note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 20:6...
--> src/third.rs:20:6
|
20 | impl<'a, T> Iterator for IterMut<'a, T> {
| ^^
note: ...so that reference does not outlive borrowed content
--> src/third.rs:25:22
|
25 | self.0 = &mut (**node).next;
| ^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0495`.
Я просмотрел Не могу определить подходящее время жизни для авторефа из-за противоречивых требований.
Я немного понимаю, но не очень. Проблема, с которой я столкнулся, заключается в том, что если я попытаюсь что-либо изменить, появится сообщение об ошибке, говорящее, что не может соответствовать определению черты.
Я думал, что в основном мне нужно как-то заявить, что время жизни 'b
переживет 'a
, то есть <'b : 'a>
, но я не могу понять, как это сделать. Кроме того, у меня есть аналогичные функции для реализации iter()
, которые отлично работают. Меня смущает, почему iter_mut()
выдает такие ошибки.
Итер
type Link<T> = Option<Box<Node<T>>>;
pub struct Iter<'a, T>(&'a Link<T>);
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.0.as_ref().map(|node| {
self.0 = &((**node).next);
&((**node).elem)
})
}
}
impl<T> List<T> {
pub fn iter(&self) -> Iter<T> {
Iter::<T>(&self.head)
}
}
☝️Это работает.
Ответов пока нет, но этот вопрос почти идентичен этому.
@SCappella, да, это почти та же проблема. Проблема не в компиляции кода. Меня в основном интересует понимание ошибки. @ Ответ Вивека устраняет некоторые сомнения, и комментарии к связанному вопросу также полезны, но все еще не могут полностью понять сообщение об ошибке и почему то же самое работает с
iter()