If statement 如有其他转让”;“移出借用内容”;
这是一段Rust代码,它在公共二叉搜索树上执行插入操作。我想要对要在其上执行插入的分支的引用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 &
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
};