提问人:lost.sof 提问时间:3/2/2023 更新时间:3/2/2023 访问量:147
如何匹配 RefMut<Enum>?
how to match RefMut<Enum>?
问:
我对 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);
}
答:
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"),
}
}
评论