Я практикую deque из этой статьи , и изменил ссылку с двойной-сильной-rc на тип слабой-сильной-rc, которая содержит Слабую предыдущую ссылку и следующую ссылку Rc, например:
pub struct List<T> {
head: NextLink<T>,
tail: PrevLink<T>,
}
type NextLink<T> = Option<Rc<RefCell<Node<T>>>>;
type PrevLink<T> = Weak<RefCell<Node<T>>>;
struct Node<T> {
elem: T,
prev: PrevLink<T>,
next: NextLink<T>,
}
Тем не менее, ссылка на элемент хвостового узла не может быть выведена из области видимости в методе peek:
impl<T> List<T> {
//...
pub fn peek_tail(&self) -> Option<Ref<T>> {
self.tail.upgrade().as_ref().map(|node| {
Ref::map(node.borrow(), |node| {
&node.elem
})
})
}
//...
}
Ошибка компиляции выглядит так:
error[E0515]: cannot return value referencing temporary value
--> _10_2_linked_list/src/lib.rs:106:9
|
106 | self.tail.upgrade().as_ref().map(|node| {
| ^------------------
| |
| _________temporary value created here
| |
107 | | Ref::map(node.borrow(), |node| {
108 | | &node.elem
109 | | })
110 | | })
| |__________^ returns a value referencing data owned by the current function
error: aborting due to previous error
For more information about this error, try `rustc --explain E0515`.
error: Could not compile `linked_list`.
Кажется, у меня нет способа гарантировать хвостовой узел в его жизненном цикле. Логически это зависит от предыдущего, поэтому я должен получить этот хвостовой узел, перебирая заголовок этого списка, что делает этот хвостовой узел бессмысленным.
Как мне решить эту проблему безопасным способом или небезопасным способом, если это необходимо?