Creare e usare matrici

Completato

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.

1.

Quale sintassi è possibile usare per dichiarare e inizializzare una matrice?

2.

Cosa accade se si tenta di accedere a un elemento di matrice con un indice maggiore rispetto alla dimensione della matrice?