Как получить ссылку на данные внутри слабо проиндексированного RefCell? - PullRequest
1 голос
/ 28 мая 2019

Я практикую 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`.

Кажется, у меня нет способа гарантировать хвостовой узел в его жизненном цикле. Логически это зависит от предыдущего, поэтому я должен получить этот хвостовой узел, перебирая заголовок этого списка, что делает этот хвостовой узел бессмысленным.

Как мне решить эту проблему безопасным способом или небезопасным способом, если это необходимо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...