Прочитать и изменить значение узла дерева в Rust - PullRequest
0 голосов
/ 07 мая 2020

Я борюсь с реализацией древовидной структуры в Rust. В частности, получение и изменение значения узла. Что такое idiomati c способ работы со значением?

Примечание: реализация дана и не может быть изменена.

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
    }
  }
}


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

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вы можете смело unwrap значение, если знаете, что это Some(T). Rc<T> должен работать как прозрачный контейнер, который отменяет ссылки на вызовы методов, поэтому вы обычно можете рассматривать Rc<T> как T или, в частности, RefCell<T> в вашем случае, тогда вы можете взаимодействовать со значением внутри RefCell с использованием методов borrow и borrow_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
}

игровая площадка

См. Также Распаковать и получить доступ к T из Option >

1 голос
/ 07 мая 2020
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...