Я новичок в Rust и, должно быть, упускаю что-то важное в правилах заимствования / владения, потому что я не могу понять, почему я получаю ошибку компиляции. Я работаю с вашими обычными определениями двоичного дерева:
#[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,
}
}
}
и где-то позже я вызываю следующее:
/*
* _t1 & _t2 are other TreeNodes.
* merge_trees() is defined as merge_trees(
* t1: Option<Rc<RefCell<TreeNode>>>,
* t2: Option<Rc<RefCell<TreeNode>>>,
* ) -> Option<Rc<RefCell<TreeNode>>>
*/
let mut head = TreeNode::new(_t1.borrow().val);
head.left = merge_trees(_t1.borrow().left, _t2.borrow().left);
Я получаю следующую ошибку:
error[E0507]: cannot move out of dereference of `std::cell::Ref<'_, TreeNode>`
--> src/main.rs:234:29
|
234 | head.left = merge_trees(_t1.borrow().left, _t2.borrow().left);
| ^^^^^^^^^^^^^^^^^
| |
| move occurs because value has type `std::option::Option<std::rc::Rc<std::cell::RefCell<TreeNode>>>`, which does not implement the `Copy` trait
| help: consider borrowing the `Option`'s content: `_t1.borrow().left.as_ref()`
запуталась ошибка; Кажется, я не могу правильно разобрать текст. Кажется, что произошло перемещение, и это запрещено, но все, что я сделал, - это разыменование структуры TreeNode. Я понимаю, что простое добавление .clone()
исправит это, но я не знаю, почему разыменование и передача в другой TreeNode может стать проблемой.