我正在练习this article上的双端队列,并将双-strong-rc的链接修改为弱-strong-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>,
}
但是,不能通过偷看方法将尾部节点元素的引用带出范围:
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`.
似乎我无法保证尾部节点的生命周期。从逻辑上讲,它取决于上一个,因此我应该通过从列表的开头进行迭代来获得该尾节点,从而使该尾节点毫无意义。
如何安全地解决此问题,或者在必要时以不安全的方式解决此问题?