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