【发布时间】:2017-12-07 19:44:59
【问题描述】:
我对 Rust 还很陌生,想实现一个 AVL-Tree。
我正在使用以下枚举来表示我的树:
enum AvlTree<T> {
Leaf,
Node {
left: Box<AvlTree<T>>,
right: Box<AvlTree<T>>,
value: T
}
}
在实现其中一项平衡功能时,我在所有权和借款方面遇到了一些问题。
我正在尝试编写一个函数,它接受一个AvlTree<T> 并返回另一个AvlTree<T>。我的第一次尝试是这样的:
fn balance_ll(tree: AvlTree<T>) -> AvlTree<T> {
if let AvlTree::Node {left: t, right: u, value: v} = tree {
if let AvlTree::Node {left: ref tl, right: ref ul, value: ref vl} = *t {
AvlTree::Leaf // Return a new AvlTree here
} else {
tree
}
} else {
tree
}
}
即使是这个最小的例子,编译器也会返回一个错误:
error[E0382]: use of partially moved value: `tree`
--> avl.rs:67:17
|
63 | if let AvlTree::Node {left: t, right: u, value: v} = tree {
| - value moved here
...
67 | tree
| ^^^^ value used here after move
|
= note: move occurs because `(tree:AvlTree::Node).left` has type `std::boxed::Box<AvlTree<T>>`, which does not implement the `Copy` trait
我认为,我正确理解了错误消息,因为解构 AvlTree::Node 将带走树示例的所有权。我怎样才能防止这种情况发生?我已经尝试了各种方法并(取消)引用tree-变量,只是为了面对更多错误。
此外,我想在新结构中使用一些提取的值,例如 u、tl 和 vl。这是可能的吗?你能不能提供一个最小的例子来做到这一点?执行该函数后,我不需要访问旧树。
【问题讨论】:
标签: enums rust avl-tree ownership