从 Rust 中的 RefCell<Option<Rc<T>>> 获取引用

Sis*_*cia 1 rust

我在从 RefCell<Option<Rc>> 获取引用时遇到问题。

有什么建议吗?

struct Node<T> {
    value: T
}

struct Consumer3<T> {
    tail: RefCell<Option<Rc<Node<T>>>>,
}

impl<T> Consumer3<T> {
    fn read<'s>(&'s self) -> Ref<Option<T>> {
        Ref::map(self.tail.borrow(), |f| {
            f.map(|s| {
                let v = s.as_ref();
                v.value
            })
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

给出:

struct Node<T> {
    value: T
}

struct Consumer3<T> {
    tail: RefCell<Option<Rc<Node<T>>>>,
}

impl<T> Consumer3<T> {
    fn read<'s>(&'s self) -> Ref<Option<T>> {
        Ref::map(self.tail.borrow(), |f| {
            f.map(|s| {
                let v = s.as_ref();
                v.value
            })
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

egg*_*yal 5

从一个映射Ref到另一个要求目标已经存在于内存中的某处。所以你不能Ref<Option<T>>从 a得到 a ,因为内存中RefCell<Option<Rc<Node<T>>>>没有任何地方。Option<T>

然而,如果OptionSome,那么内存中就会有一个T,您可以从中获取Ref<T>; 如果OptionNone,显然你不能。因此,返回Option<Ref<T>>对您来说可能是一个可行的选择:

use std::{cell::{Ref, RefCell}, rc::Rc};

struct Node<T> {
    value: T
}

struct Consumer3<T> {
    tail: RefCell<Option<Rc<Node<T>>>>,
}

impl<T> Consumer3<T> {
    fn read(&self) -> Option<Ref<T>> {
        let tail = self.tail.borrow();
        
        if tail.is_some() {
            Some(Ref::map(tail, |tail| {
                let node = tail.as_deref().unwrap();
                &node.value
            }))
        } else {
            None
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场