Tableau de struct champ
Je voudrais créer un arbre binaire non de la structure de la Rouille. Voici un essai
struct TreeNode<T> {
tag : T,
father : Weak<TreeNode<T>>,
childrenlists : [Rc<TreeNode<T>>]
}
Malheureusement, cela ne compile pas.
main.rs:4:1: 8:2 error: the trait `core::marker::Sized` is not implemented for the type `[alloc::rc::Rc<TreeNode<T>>]` [E0277]
main.rs:4 struct TreeNode<T> {
main.rs:5 tag : T,
main.rs:6 father : Weak<TreeNode<T>>,
main.rs:7 childrenlist : [Rc<TreeNode<T>>]
main.rs:8 }
main.rs:4:1: 8:2 note: `[alloc::rc::Rc<TreeNode<T>>]` does not have a constant size known at compile-time
main.rs:4 struct TreeNode<T> {
main.rs:5 tag : T,
main.rs:6 father : Weak<TreeNode<T>>,
main.rs:7 childrenlist : [Rc<TreeNode<T>>]
main.rs:8 }
error: aborting due to previous error
Le code se compile si l'on remplace un tableau avec une Vec
. Cependant, la structure est immuable et je n'ai pas besoin d'un surutilisée Vec
.
J'ai entendu qu'il pourrait être possible d'avoir une structure de champ avec la taille de l'inconnu au moment de la compilation, à condition qu'il soit unique. Comment pouvons-nous le faire?
- Je pensais que l'exigence était la "dernière", mais de toute façon, c'est aussi le cas ici. J'ai trouvé reddit.com/r/rust/comments/357ji5/...
- Dans la Rouille, les tableaux ont une taille fixe, connue au moment de la compilation. Ainsi, vous ne voulez pas un "tableau".
&[T]
est généralement appelé une tranche, je ne sais pas comment le prononcer[T]
. - Je suppose que ce serait "sans colle tableau".
Vous devez vous connecter pour publier un commentaire.
La rouille n'a pas la notion de longueur variable (pile), tableau, à laquelle vous semblez vous être en train d'essayer d'utiliser ici.
La rouille a un couple de différentes array-ish types.
Vec<T>
("vector"): Dynamiquement la taille; dynamiquement alloué sur le tas. C'est probablement ce que vous voulez utiliser. L'initialiser avecVec::with_capacity(foo)
pour éviter la surutilisation (cela crée un vecteur vide avec la capacité donnée).[T; n]
("array"): de manière Statique de taille moyenne; vit sur la pile. Vous avez besoin de connaître la taille au moment de la compilation, cela ne fonctionne pas pour vous (à moins que j'ai misanalysed votre situation).[T]
("tranche"): sans apprêt; généralement utilisé à partir de&[T]
. C'est une vue d'un ensemble contigu deT
s en mémoire quelque part. Vous pouvez l'obtenir en prenant une référence à un tableau, ou d'un vecteur (appelé "prendre une tranche d'une matrice/vecteur"), ou même la prise de vue dans un sous-ensemble de la matrice/vecteur. Être sans apprêt,[T]
peut pas être utilisé directement comme une variable (il peut être utilisé en tant que membre d'un non dimensionnés struct), mais vous pouvez le voir derrière un pointeur. Les pointeurs se référant à[T]
sont graisse ; c'est à dire qu'ils ont un champ supplémentaire pour la longueur.&[T]
serait utile si vous souhaitez stocker une référence à un tableau existant; mais je ne pense pas que c'est ce que vous voulez faire ici.[T]
. Je pense que c'est un manque de l'information, comme je l'ai vu nulle part ailleurs.Si vous ne connaissez pas la taille de la liste à l'avance, vous avez deux choix:
&[T]
qui est juste une référence à un élément de mémoire que vous ne possédez pasVec<T>
qui est votre propre de stockage.La bonne chose ici est d'utiliser une
Vec
. Pourquoi? Parce que vous voulez la liste des enfants (tableau deRc
) pour être réellement détenus par leTreeNode
. Si vous avez utilisé un&[T]
, cela signifie que quelqu'un d'autre serait de garder la liste, pas leTreeNode
. Avec une certaine durée de vie de la tricherie, vous pourriez écrire un peu de code valide, mais vous aurez à aller très loin pour s'il vous plaît le compilateur car les emprunts de référence devra être valide au moins aussi longtemps que laTreeNode
.Enfin, une phrase dans votre question montre un malentendu:
Vous confondez la mutabilité et de la propriété. Bien sûr, vous pouvez avoir un immuable Vec. Il semble que vous voulez éviter d'allouer de la mémoire dans le tas, mais ce n'est pas possible, justement parce que vous ne connaissez pas la taille de la liste des enfants. Maintenant, si vous êtes préoccupé par le overallocating, vous pouvez affiner le vecteur de stockage avec des méthodes comme
with_capacity()
etshrink_to_fit()
.Une dernière remarque: si vous avez réellement connaître la taille de la liste, car il est fixé au moment de la compilation, vous avez juste besoin d'utiliser un
[T; n]
oùn
est au moment de la compilation connue. Mais ce n'est pas le même que[T]
.