If statement 如有其他转让”;“移出借用内容”;

If statement 如有其他转让”;“移出借用内容”;,if-statement,rust,binary-search-tree,variable-assignment,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 &

这是一段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
        };

        // ...
    }
}
struct节点{
值:i32,
左:选项,
右:选项,
}
impl节点{
fn插入(&mut self,元素:i32){
设ref mut a=如果元素
此代码无效。经过调整后,我明白了当我执行if/else语句时,Rust会在分配内容之前移动内容。这个解决方案可行,但它真的很难看

let a = if elem < self.value {
    let ref mut b = self.left;
    b
} else {
    let ref mut b = self.right;
    b
};
设a=if elem
有没有一种方法可以处理这件事而不必重复使用盒子?我可以用一个指针,但它看起来真的太过分了

在注释之后,这是完整的代码

fn插入(&mut self,元素:i32){
让目标=如果元素{}
一些(参考mut节点)=>{
节点插入(elem);
返回;
}
}
mem::replace(&mut*target,一些(Box::new(Node::new(elem)));
}

正如您所观察到的,在您最初的尝试中,“then”和“else”分支都试图将左侧或右侧框从您的
&mut self
借用的内容中移出,这是不允许的

let ref mut a = if elem < self.value {
    self.left
} else {
    self.right
};
使用
&mut
操作符可以更清楚地通过可变引用引用某事物。if语句应为:

let a = if elem < self.value {
    &mut self.left
} else {
    &mut self.right
};
设a=if elem
我不确定您为什么要使用
ref
关键字。请参阅此不使用它的游乐场链接:。我将
a
指定为
self.left
self.right
TBH的可变引用。作为初学者,我发现使用
ref
的绑定很容易混淆,并且只会在模式匹配上下文(
match
if let
)中使用它,在没有它的情况下我无法编译代码。谢谢,它很有效。我想我只是被弄糊涂了,因为在我用了一根火柴之后。。。在这一点上,我展示了插入代码…正如您所看到的,稍后我进行了一些匹配等。我想我开始使用ref,因为第一个版本不起作用。。。我多次把头撞在借书台上,我都麻木了。这是最后一次编辑的答案吗?如果是这样,它就不属于这个问题。欢迎您在下面给出自己的答案。
let a = if elem < self.value {
    let ref mut b = self.left;
    b
} else {
    let ref mut b = self.right;
    b
};
let a = if elem < self.value {
    &mut self.left
} else {
    &mut self.right
};