Владение Rust: понимание ходов / заимствования лучше - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в 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 может стать проблемой.

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