如何返回对Rc内部值的引用<RefCell<Node>>

问题描述 投票:0回答:1

我在 Rust 中有以下结构:

type NodePtr = Rc<RefCell<Node>>;

struct Node { 
    value: Option<String>,

    weight: usize,
    height: usize,

    parent: Option<Weak<RefCell<Self>>>,
    left: Option<NodePtr>,
    right: Option<NodePtr>
}

我创建了特征

trait Access
trait TreeNode
并为
NodePtr
实现了它们。

trait Access {
    fn borrow_node(&self) -> Ref<Node>;
    fn borrow_node_mut(&self) -> RefMut<Node>;
}

trait TreeNode: Sized {
    fn is_leaf(&self) -> bool;
    fn set_left_child(&self, child: Option<Self>);
    fn set_right_child(&self, child: Option<Self>);
    fn contains_left(&self, line: usize, prev_lines: usize) -> bool;
    fn contains_right(&self, line: usize, prev_lines: usize) -> bool;
    fn find_node(&self, line: usize) -> Option<(Self, Side)>;
    fn insert_into(self, node: Self, placement: Side) -> Self;
    fn get_line(&self, line: usize) -> Option<&String>;
}
impl Access for NodePtr
impl TreeNode for NodePtr

其中一种方法如下:

fn find_node(&self, line: usize) -> Option<(Rc<RefCell<Node>>, Side)>;

此函数返回所需注释的 parent,并且 Side 枚举包含有关左子节点还是右子节点的信息(这样设计是为了使节点可以轻松替换)。

现在我遇到了麻烦。我似乎无法返回对节点包含的字符串的引用,从而导致内部数据实际上无法访问。

NodePtr的另一个方法是find函数:

fn get_line(&self, line: usize) -> Option<Ref<String>> {
    if let Some((node, side)) = self.find_node(line) {
        let child = match side {
            Side::Left => Rc::clone(node.borrow_node().left.as_ref().unwrap()),
            Side::Right => Rc::clone(node.borrow_node().right.as_ref().unwrap())
        };
        return Some(Ref::map(node.borrow(), |n| n.value.as_ref().unwrap()));
    }
    None
}

这就是我收到错误的地方:

error[E0515]: cannot return value referencing local variable 'node'
   --> src\blahblah.rs:152:20
    |
152 |             return Some(Ref::map(node.borrow(), |n| n.value.as_ref().unwrap()));
    |                    ^^^^^^^^^^^^^^----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |                    |             |
    |                    |             'node' is borrowed here
    |                    returns a value referencing data owned by the current function

而且我似乎无法找到一种方法来获取对任何形状或形式的拥有数据的引用。

什么可以工作,是返回一个选项>,但这很荒谬,而且我也不知道如何将 None 放入引用中。

非常感谢您的帮助。

我尝试以多种方式返回一个Option和一个Option<&String>,但都失败了。我无法通过借阅检查器。

rust borrow-checker ownership interior-mutability
1个回答
0
投票

你不能那样做。您已经陷入了使用

Rc<RefCell>
图表的缺点之一。

您可以做的关闭是返回整个节点,可能使用一些包装器只允许获取长度。

或者您可以使用一些允许您以类似于投影

Rc
的方式投影
RefCell
的库,例如
mappable-rc
,但这仍然需要您更改方法的返回类型。

更好的方法是使用图形库,例如

petgraph

© www.soinside.com 2019 - 2024. All rights reserved.