如何匹配 RefMut<Enum>?

how to match RefMut<Enum>?

提问人:lost.sof 提问时间:3/2/2023 更新时间:3/2/2023 访问量:147

问:

我对 rust RefCell 不是很熟练

我想知道如何解决以下错误。

如果有人能回答我的问题,我将不胜感激。

use std::rc::Rc;
use std::cell::RefCell;


enum Node {
    Branch { name: String },
    Leaf { name: String },
}

fn test_match(node: &Rc<RefCell<Node>>) {
    let borror_mut_node = RefCell::borrow_mut(node);
    match borror_mut_node {
        Node::Branch { name } => name.push_str("b"),
        Node::Leaf { name } => name.push_str("l"),
    }
}

fn main() {
    let node = Node::Branch { name: "test-" };
    let node = Rc::new(RefCell::new(node));
    test_match(&node);
}

Rust 游乐场

蚀反射

评论


答:

4赞 vikram2784 3/2/2023 #1

您需要声明 mutable,match on,然后对内部字段进行可变引用。borror_mut_node*borror_mut_node

fn test_match(node: &Rc<RefCell<Node>>) {
    let mut borror_mut_node = RefCell::borrow_mut(node);
    match *borror_mut_node {
        Node::Branch { ref mut name } => name.push_str("b"),
        Node::Leaf { ref mut name } => name.push_str("l"),
    }
}

您可以通过删除 来进一步简化它。你不需要它。borror_mut_node

fn test_match(node: &Rc<RefCell<Node>>) {
    //let  borror_mut_node = RefCell::borrow_mut(node);
    match *node.borrow_mut() {
        Node::Branch { ref mut name } => name.push_str("b"),
        Node::Leaf { ref mut name } => name.push_str("l"),
    }
}

另一种方法是匹配可变的再借款。

fn test_match(node: &Rc<RefCell<Node>>) {
    //let  borror_mut_node = RefCell::borrow_mut(node);
    match &mut *node.borrow_mut() {
        Node::Branch { name } => name.push_str("b"),
        Node::Leaf { name } => name.push_str("l"),
    }
}