如何在弱索引的RefCell中获取对数据的引用?

时间:2019-05-28 02:07:28

标签: rust

我正在练习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`.

似乎我无法保证尾部节点的生命周期。从逻辑上讲,它取决于上一个,因此我应该通过从列表的开头进行迭代来获得该尾节点,从而使该尾节点毫无意义。

如何安全地解决此问题,或者在必要时以不安全的方式解决此问题?

0 个答案:

没有答案