Gestione dei moduli in Rust

La gestione dei moduli in Rust

In questa guida, vediamo come si creano e gestiscono i moduli di un progetto Rust. Vediamo perciò come creare e strutturare un progetto pulito con i moduli ben organizzati. E’ importante iniziare dai moduli principali e che vengono richiamati nella funzione principale e poi procedere in sottomoduli.

Quando si crea un nuovo progetto o si estende uno esistente, è importante organizzare il codice in moduli separati. Inoltre, la logica viene spesso separata dall’interfaccia che in modo che quest’ultima richiami solo le funzioni che le servono. In Rust diventa molto facile creare nuovi moduli una volta capito come funziona.

Quando creiamo un nuovo progetto, all’interno della cartella src abbiamo tutto ciò che serve per creare un programma eseguibile o una libreria. L’insieme dei moduli necessarie al funzionamento di un programma è un crate

Un pacchetto è l’insieme degli strumenti che permettono di costruire, testare e condividere uno o più crate. Possiamo creare cartelle separate a src come examples e tests.

La parola chiave pub rende il codice seguente pubblico in ogni parte del progetto. La parola chiave pub(crate) rende il codice pubblico soltanto all’interno del suo crate e privato a livello globale. Se non usiamo nessuna parola chiave prima del modulo questo sarà disponibile e utilizzabile solo all’interno del modulo padre.

Possiamo rendere pubbliche strutture ed enumerazioni. Tuttavia, i singoli campi di una struttura rimangono privati se non aggiungiamo pub. Rimane una buona norma mantenere i campi di una struttura privati e usare i getter e i setter per accedere ai suoi valori e modificarli.

Esempio della gestione dei moduli in Rust

Ritorniamo all’esempio di un videogioco: al suo interno abbiamo gli oggetti che possono avere una posizione, una forma e altri componenti. In lib.rs possiamo creare i nostri moduli, scrivendo semplicemente:

pub mod nome; 

Rust ci dirà che non esiste ancora questo modulo e ci permetterà di crearlo. Cliccando su Correzione Rapida, possiamo decidere se creare un file dentro la cartella dove si trova il modulo padre oppure dentro una sottocartella chiamata nome_modulo/mod.rs. Il secondo metodo è più tradizionale ma in grossi progetti avremo molti file mod.rs. Con i nomi specifici sapremo sempre su cosa stiamo lavorando

Quando scriviamo il nome di un modulo che non esiste ancora, Rust ci suggerirà di crearlo automaticamente.
Quando scriviamo il nome di un modulo che non esiste ancora, Rust ci suggerirà di crearlo automaticamente.

All’interno di un modulo possiamo creare sottomoduli. Ad esempio in lib.rs possiamo creare i moduli battle, components e object mentre in components possiamo creare i moduli shape e position.

Quando un modulo richiama un altro di quelli collegati nel modulo padre, l’editor creerà direttamente il riferimento. In ogni caso basterà scrivere use:: e cercare il percorso che ci interessa.

Utilizzo dei moduli in Rust nel progetto con il percorso assoluto
Utilizzo dei moduli in Rust nel progetto con il percorso assoluto

In genere, Rust scriverà i percorsi assoluti, soprattutto in main.rs e nelle cartelle examples e tests. Bisogna indicare il crate, il modulo principale e i sottomoduli usati. Quando un modulo ha bisogno di un altro che appartiene alla stessa directory userà super:: per indicare il padre.

Ad esempio abbiamo un modulo battle e tre sottomoduli chiamati state, system e unit. Il modulo system richiamerà state in questo modo:

use super::state; 

Se li chiama entrambi scriveremo

use super::{state,unit}