作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为 rust 借用和生命周期的练习,我想实现一个简单的二叉树。但是,我被困在了一些事情上。考虑一下:
struct Node {
key: i32,
value: i32,
left: Option<Box<Node>>,
right: Option<Box<Node>>,
}
struct BinaryTree {
root: Option<Box<Node>>,
}
impl BinaryTree {
fn find_mut(&mut self, key: i32) -> &mut Option<Box<Node>> {
let mut node = &mut self.root;
loop {
match node {
Some(box_node) if box_node.key != key => {
node = if box_node.key < key {
&mut box_node.right
} else {
&mut box_node.left
}
},
other => return other
}
}
}
}
以上无法编译:
error[E0505]: cannot move out of `node` because it is borrowed
--> src/main.rs:40:17
|
29 | fn find_mut(&mut self, key: i32) -> &mut Option<Box<Node>> {
| - let's call the lifetime of this reference `'1`
...
33 | Some(box_node) if box_node.key != key => {
| -------- borrow of `node.0` occurs here
...
40 | other => return other
| ^^^^^ ----- returning this value requires that `node.0` is borrowed for `'1`
| |
| move out of `node` occurs here
我尝试显式设置
self
的生命周期和输出。我还尝试扩展
Some(_)
None
的 ARM 和火柴而不是
other
也是。
find_mut
的目的是向应该创建新节点的对象(以防找不到键)或现有节点所在的对象返回一个引用。
最佳答案
Rust 编译器出现错误的原因是因为 Some(expr)
模式匹配整个表达式以其拥有的形式,即 expr
被移动。
通常,这很容易通过匹配表达式作为借用 Some(ref expr)
来解决。 , 或可变借用 Some(ref mut expr)
,但这里不是这样。
如果您查看标准库,您会经常看到 as_mut()
/as_ref()
, 当值可能不存在时,总是返回 Option<&mut T>
而不是 &mut Option<T>
.那是因为你真的想访问这个值,而不是数据结构的任何内部结构,它的结构类似于 Option<Box<None>>
是。
在那之后,我想出了这个:
struct Node {
key: i32,
value: i32,
left: Option<Box<Node>>,
right: Option<Box<Node>>,
}
struct BinaryTree {
root: Option<Box<Node>>,
}
impl BinaryTree {
fn find_mut(&mut self, key: i32) -> Option<&mut Node> {
// &mut Option<Box<Node>> -> Option<&mut Box<Node>> -> Option<&mut Node>
let mut node = self.root.as_mut().map(|boxed| boxed.as_mut());
loop {
match node {
Some(box_node) if box_node.key != key => {
node = if box_node.key < key {
box_node.right.as_mut().map(|boxed| boxed.as_mut())
} else {
box_node.left.as_mut().map(|boxed| boxed.as_mut())
}
},
other => return other
}
}
}
}
可能有更好的方法来写这个,但我现在不知道。
&mut Node
是移到这里的内容,同时使 API 变得更好。
Vec::binary_search
, 和
BTreeMap
/
BTreeSet
,并且很可能在
crates.io
上除了最极端的情况外,还有其他实现应该涵盖所有情况,并且自己制作搜索树没有什么意义。
关于rust - 无法从匹配臂返回对成员的可变引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63428868/
当我跑qemu-arm -L /usr/arm-linux-gnueabi/ ./foo在码头 Linux 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC
我是一名优秀的程序员,十分优秀!