Creare e usare matrici
Rust dispone di diversi tipi di dati composti che possono essere usati per raggruppare più valori in un singolo tipo. In un altro modulo si è esaminato il tipo di dati tuple
, utile quando si vogliono combinare tipi diversi in un singolo valore. In questa sezione verrà illustrato il tipo di dati array
.
Una matrice è una raccolta di oggetti dello stesso tipo che vengono archiviati in sequenza in memoria. La lunghezza o le dimensioni di una matrice sono uguali al numero di elementi contenuti al suo interno. Le dimensioni di una matrice possono essere specificate nel codice o calcolate dal compilatore.
Definire una matrice
Una matrice può essere definita in due modi:
- Un elenco di valori delimitati da virgole, se la lunghezza non viene specificata.
- Il valore iniziale seguito da un punto e virgola e quindi dalla lunghezza della matrice.
In entrambi i casi, il contenuto è racchiuso tra parentesi quadre []
.
// Declare array, initialize all values, compiler infers length = 7
let days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
// Declare array, initialize all values to 0, length = 5
let bytes = [0; 5];
Leggere la firma della matrice
In fase di compilazione, la firma di una matrice è definita come [T; size]
:
T
è il tipo di dati per tutti gli elementi della matrice.size
è un intero non negativo che rappresenta la lunghezza della matrice.
La firma rivela due caratteristiche importanti relative alle matrici:
- Ogni elemento di una matrice deve essere dello stesso tipo. Il tipo di dati non cambia mai.
- Le dimensioni di una matrice sono fisse. La lunghezza non cambia mai.
Una sola cosa di una matrice può cambiare nel tempo: i valori degli elementi al suo interno. Il tipo di dati rimane costante così come il numero di elementi (lunghezza). Solo i valori possono cambiare.
Eseguire l'indicizzazione in una matrice
Gli elementi di una matrice vengono numerati in modo implicito a partire da 0. L'indicizzazione si usa per accedere agli elementi di una matrice con l'espressione <array>[<index>]
. Per esempio, my_array[0]
accede all'elemento in corrispondenza dell'indice 0 nella variabile my_array
. L'espressione restituisce il valore dell'elemento della matrice in corrispondenza della posizione dell'indice.
Di seguito viene esaminata una matrice denominata days
con sette elementi:
// Days of the week
let days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
// Get the first day of the week
let first = days[0];
// Get the second day of the week
let second = days[1];
Per accedere agli elementi della matrice days
si usa un indice compreso tra 0 e la lunghezza della matrice -1 o 6. Il primo elemento in corrispondenza dell'indice 0 ha il valore "Domenica". Il settimo elemento in corrispondenza dell'indice 6 ha il valore "Sabato".
Per assegnare un valore alla variabile first
, si usa l'espressione days[0]
per ottenere il valore del primo elemento della matrice days
, ovvero Sunday
. Per la variabile second
, si usa un'espressione days[1]
simile per ottenere il valore del secondo elemento della matrice days
, ovvero Monday
.
Controllare i valori di indice fuori limite
Se si prova ad accedere a un elemento della matrice con un indice non compreso nell'intervallo consentito, il compilatore restituisce un errore. Un'espressione come days[7]
non è compresa nell'intervallo, perché la matrice contiene solo sette elementi. L'intervallo di indici valido è compreso tra 0 e 6. Qualsiasi indice maggiore o uguale alla lunghezza della matrice non è compreso nell'intervallo. Qualsiasi indice che corrisponde a un numero negativo non è compreso nell'intervallo.
Il codice seguente illustra l'errore del compilatore in questi casi:
// Get the seventh day of the week using the wrong index - should be 6
let seventh = days[7];
Output dell'errore:
error: this operation will panic at runtime
--> src/main.rs:19:42
|
19 | let seventh = days[7];
| ^^^^^^^ index out of bounds: the length is 7 but the index is 7
|
Dato che la lunghezza della matrice è nota in fase di compilazione, Rust rende impossibile compilare un programma che tenta di accedere alla matrice con un indice fuori intervallo.
È possibile interagire con questo codice ed esplorare le matrici in questa istanza di Rust Playground.
Verificare le conoscenze
Rispondere alle domande seguenti per verificare i concetti appresi. Scegliere una risposta per ogni domanda, quindi selezionare Controlla le risposte.