,-6ren">
gpt4 book ai didi

if-statement - 如果否则赋值 "move out of borrowed content"

转载 作者:行者123 更新时间:2023-11-29 08:36:15 24 4
gpt4 key购买 nike

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

最佳答案

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

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

如您所说,您的第二次尝试编译成功但很丑陋。此代码通过ref mut 可变引用来引用左右框,从而避免移出借用的内容。

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

通过可变引用来引用某物的更简洁的方法是使用 &mut 运算符。 if 语句应该是:

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

关于if-statement - 如果否则赋值 "move out of borrowed content",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48772143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com