如何读取和修改链接树中节点的值?
How to read & modify value of node in linked tree?
我正在为 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
}
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
如果您知道该值是 Some(T)
,则可以安全地 unwrap
。 Rc<T>
应该像透明容器一样工作,在方法调用时取消引用,因此您通常可以将 Rc<T>
视为 T
,或者在您的情况下特别是 RefCell<T>
,然后您可以使用 borrow
和 borrow_mut
方法与 RefCell
中的值进行交互。示例:
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
}
另见
我正在为 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
}
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
如果您知道该值是 Some(T)
,则可以安全地 unwrap
。 Rc<T>
应该像透明容器一样工作,在方法调用时取消引用,因此您通常可以将 Rc<T>
视为 T
,或者在您的情况下特别是 RefCell<T>
,然后您可以使用 borrow
和 borrow_mut
方法与 RefCell
中的值进行交互。示例:
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
}
另见