Je suis assez nouveau pour Rust et je veux implémenter un AVL-Tree.Valeurs d'accès dans une structure imbriquée en boîte
J'utilise le ENUM suivant pour représenter mon arbre:
enum AvlTree<T> {
Leaf,
Node {
left: Box<AvlTree<T>>,
right: Box<AvlTree<T>>,
value: T
}
}
Lors de la mise en œuvre l'un des balanciers fonctions, je suis confronté à des problèmes de propriété et d'emprunt.
J'essaye d'écrire une fonction, qui prend un AvlTree<T>
et renvoie un autre AvlTree<T>
. Ma première tentative a été quelque chose comme ceci:
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
}
}
Même avec cet exemple minimal, le compilateur renvoie une erreur:
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
Je pense, je comprends le message d'erreur correctement, dans ce destructuration le AvlTree::Node
enlèvera la propriété de l'exemple d'arbre. Comment puis-je empêcher cela? J'ai déjà essayé plusieurs choses et (dé) référencer la variable tree
uniquement pour faire face à plus d'erreurs.
En outre, je veux utiliser certaines des valeurs extraites comme u
, tl
et vl
dans la nouvelle structure. Est-ce possible et pourriez-vous fournir un exemple minimal en faisant exactement cela? Je n'ai pas besoin d'accéder à l'ancien arbre après l'exécution de la fonction.
Cela a fonctionné comme un charme, merci! – lschuermann