如果分配“移出借来的内容”

时间:2018-02-13 17:12:48

标签: if-statement rust binary-search-tree variable-assignment

这是Rust代码的片段,它在公共二叉搜索树上执行插入。我希望引用我将执行插入的分支。

struct Node {
    value: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

impl Node {
    fn insert(&mut self, elem: i32) {
        let ref mut a = if elem < self.value {
            self.left
        } else {
            self.right
        };

        // ...
    }
}

此代码无效。在调整之后,我开始明白当我执行if / else语句时,Rust会在分配内容之前移动内容。这个解决方案有效,但它真的很难看......

let a = if elem < self.value {
    let ref mut b = self.left;
    b
} else {
    let ref mut b = self.right;
    b
};

有没有办法处理这个东西而不会重复出现在Box中?我可以使用指针,但它看起来有点矫枉过正。

评论后,这是整个代码

fn insert(&mut self, elem: i32) {
    let target = if elem < self.value {
        &mut self.left
    } else {
        &mut self.right
    };

    match target.as_mut() {
        None => {}
        Some(ref mut node) => {
            node.insert(elem);
            return;
        }
    }

    mem::replace(&mut *target, Some(Box::new(Node::new(elem))));
}

0 个答案:

没有答案