0

我正在努力在 Rust 中实现树结构。特别是获取和修改节点的值。使用价值的惯用方式是什么?

注意:实现是给定的,不能更改。

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

// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
  pub val: i32,
  pub left: Option<Rc<RefCell<TreeNode>>>,
  pub right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
  #[inline]
  pub fn new(val: i32) -> Self {
    TreeNode {
      val,
      left: None,
      right: None
    }
  }
}

fn main() {
    let mut root = Some(Rc::new(RefCell::new(TreeNode::new(1))));
    println!("{:?}", root.unwrap().borrow().val); // cannot infer type for type parameter `Borrowed`
    root.unwrap().get_mut().val = 2; // cannot borrow data in an `Rc` as mutable
}
4

2 回答 2

1

unwrap如果你知道它的值,你可以安全地使用它Some(T)。应该像一个透明容器一样在Rc<T>方法调用上取消引用,因此您通常可以将 aRc<T>视为 a T,或者在您的情况下特别是 a ,然后您可以使用and方法RefCell<T>与内部的值进行交互。例子:RefCellborrowborrow_mut

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

// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
  pub val: i32,
  pub left: Option<Rc<RefCell<TreeNode>>>,
  pub right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
  #[inline]
  pub fn new(val: i32) -> Self {
    TreeNode {
      val,
      left: None,
      right: None
    }
  }
}


fn main() {
    let mut root = Some(Rc::new(RefCell::new(TreeNode::new(1))));
    let mut root = root.unwrap();
    println!("{:?}", root.borrow().val); // read access
    root.borrow_mut().val = 2; // write access
}

操场

另请参阅从 Option<Rc<RefCell<T>>> 展开和访问 T

于 2020-05-07T20:10:53.363 回答
1
let root = Some(Rc::new(RefCell::new(TreeNode::new(1))));
let mut v = RefCell::borrow(root.as_ref().unwrap()).val) // Too verbose, but I do not know a brief way.
println!("{}", v); // 1
root.as_ref().unwrap().borrow_mut().val += 1;
v = RefCell::borrow(root.as_ref().unwrap()).val)
println!("{}", v); // 2

于 2020-05-07T20:02:30.617 回答