et comme m’a été conseillé, je vais retravailler les fonctions pour accepter les Rc ou Arc (quelle est la différence ?).
Je doute fortement que tu ais besoin ni de l’un ni de l’autre mais soit. Les Rc
sont des pointeurs intelligents permettant de partager l'ownership (alors qu’une valeur "normale" en Rust n’a qu’un seul owner). C’est une façon assez cheap de pouvoir partager une référence entre plusieurs structures sans lier les lifetimes de ces structures. Une référence n’a pas le droit de vivre plus longtemps que la donnée référencée en Rust, donc si tu veux que plusieurs objets pointent vers la même donnée, tu dois t’assurer que la donnée vit au moins aussi longtemps que les objets ayant une référence. Si tu as un seul owner de la donnée en question, ça signifie que tous les objets ayant une référence vers cette donnée ont une durée de vie contrainte par celle de cet owner. Rc
permet de s’affranchir de cette limite en permettant à plusieurs objets de posséder la donnée, et garantir que la donnée vivra tant qu’elle a au moins un owner encore en vie.
Un Arc
est essentiellement la même chose, avec en plus la possibilité de partager l'ownership entre différent threads. Partout où tu peux utiliser un Rc
, tu peux utiliser un Arc
à la place. Ça a bien sûr un coût au runtime, et donc si tu ne comptes pas utiliser des threads, autant utiliser Rc
.
Cela dit, vu ce que tu cherches à implémenter, je pense que tu peux t’en sortir simplement avec des String
et des &str
.
Par rapport au Rust book, j’avais commencé à le lire, mais de peur de ne faire que lire et de ne rien à faire avec Rust, j’ai commencé un projet qui m’intéressait, alors évidemment il y a des couacs.
Je pense que tu mets un peu la charrue avant les bœufs. Plutôt que t’attaquer directement à un projet aussi complexe, tu devrais plutôt essayer de faire des exercices plus simples. On ne peut pas se leurrer, Rust a un coût d’entrée plutôt important et se lancer tête baissée dans un projet relativement conséquent risque plus de te faire prendre de mauvaises habitudes.
Pour la façon idiomatique de procéder en Go, ça a l’air plus simple, mais comme il s’agit d’un langage de haut niveau, cela semble logique.
Ce n’est pas vraiment une question de "haut" vs "bas" niveau. Je dirais plutôt que Rust offre de nombreux niveaux d’abstractions qui n’existent pas en Go. Go est plus simple de part son modèle mémoire (avec GC) et des choix de design qui visent à rendre le langage minimal. Rust fait un peu le choix inverse en exposant des abstractions très diverses à l’utilisateur et un modèle mémoire (à ownership et lifetimes) moins coûteux au runtime mais plus contraignants pour le développeur. Ça a un coût d’entrée.