Lezioni del modulo (1/2)
Collezioni e HashMap
Le collezioni sono strutture dati in grado di contenere più valori. A differenza dei tipi primitivi array e tupla, i dati a cui fanno riferimento queste collezioni sono memorizzati nello heap, il che significa che la quantità di dati non deve essere nota a tempo di compilazione e può crescere o ridursi dinamicamente durante l'esecuzione del programma.
Le due collezioni più utilizzate in Rust sono i vettori (Vec<T>) e le mappe chiave-valore (HashMap<K, V>).
Vettori (Vec<T>)
I vettori consentono di memorizzare più di un valore dello stesso tipo in una singola struttura dati che mette tutti i valori uno accanto all'altro in memoria:
fn main() {
// Creazione di un vettore vuoto mutabile
let mut v: Vec<i32> = Vec::new();
// Oppure usando la macro vec!
let mut v2 = vec![1, 2, 3];
// Aggiunta di elementi
v.push(5);
v.push(6);
// Accesso agli elementi per indice
let third = v2[2];
println!("Il terzo elemento è: {}", third);
}
HashMap (HashMap<K, V>)
La collezione HashMap<K, V> memorizza una mappatura di chiavi di tipo K a valori di tipo V. Funziona tramite una funzione di hashing, che determina come queste chiavi e valori vengono posizionati in memoria. È estremamente utile quando si vogliono cercare dati non tramite un indice numerico, ma tramite una chiave (ad esempio, un nome o un ID).
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
// Inserimento chiave-valore
scores.insert(String::from("Blu"), 10);
scores.insert(String::from("Giallo"), 50);
// Lettura di un valore (ritorna un Option<&V>)
let team_name = String::from("Blu");
let score = scores.get(&team_name);
match score {
Some(val) => println!("Punteggio: {}", val),
None => println!("Nessun punteggio trovato."),
}
}
Prova tu
Esercizio 1: Operazioni base su Vec
Dichiara un vettore mutabile di interi chiamato v usando Vec::new(). Aggiungi al vettore gli elementi 10, 20 e 30 in sequenza usando il metodo push. Infine, stampa il primo elemento del vettore (indice 0) usando println!.
Mostra suggerimento
Usa `let mut v = Vec::new();` per il vettore, inserisci gli elementi con `v.push(valore)` e accedi con `v[0]`.
Soluzione disponibile dopo 3 tentativi
Esercizio 2: Punteggi con HashMap
Importa std::collections::HashMap. Nel main, dichiara una HashMap mutabile chiamata scores per memorizzare chiavi String e valori i32. Inserisci un punteggio di 50 per l'utente 'Alice'. Estrai in sicurezza il punteggio usando il metodo get ed unwrap() per stamparlo.
Mostra suggerimento
Non dimenticare `use std::collections::HashMap;`. Inserisci con `scores.insert(String::from("Alice"), 50);`e recupera il valore con`.get("Alice").unwrap()`.
Soluzione disponibile dopo 3 tentativi
Esercizio 3: Raddoppiare i valori in un vettore
Definisci una funzione chiamata double_values che accetta in input un riferimento a un vettore di interi &[i32] e restituisce un nuovo vettore Vec<i32> contenente gli stessi elementi moltiplicati per 2.
Mostra suggerimento
La funzione deve scorrere gli elementi del slice ed inserirli moltiplicati per 2 nel nuovo vettore da ritornare.
Soluzione disponibile dopo 3 tentativi