Vai al contenuto
eLearner.app
Modulo 4 · Lezione 1 di 27/14 nel corso~12 min
Lezioni del modulo (1/2)

Definire e istanziare Struct

Le struct (o strutture) in Rust sono tipi di dati personalizzati che ti consentono di raggruppare insieme più valori correlati. Sono simili agli oggetti o classi in altri linguaggi, ma senza ereditarietà.

Definire una Struct

Per definire una struct, utilizziamo la parola chiave struct seguita dal nome in PascalCase. All'interno definiamo i nomi e i tipi dei campi:

Code
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

Creare un'Istanza

Per utilizzare una struct, dobbiamo creare un'istanza compilando tutti i campi specificati:

Code
fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    // Accesso ai campi tramite notazione con punto
    println!("L'utente {} è attivo? {}", user1.username, user1.active);
}

Mutabilità delle Struct

In Rust, l'intera istanza deve essere marcata come mutabile (mut) se desideri modificare uno qualsiasi dei suoi campi. Rust non consente di marcare solo alcuni campi come mutabili:

Code
fn main() {
    let mut user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    user1.active = false; // Valido perché user1 è mutabile!
}

Tuple Structs e Unit-Like Structs

Rust supporta altri due formati di struct oltre alle classiche struct a campi nominati:

  1. Tuple Structs: Hanno un nome associato ma i campi non hanno nomi individuali, possiedono solo il tipo. Sono utili per definire e differenziare tipi specifici:
    Code
    struct Point(i32, i32, i32);
    let origin = Point(0, 0, 0);
    
  2. Unit-Like Structs: Non definiscono alcun campo. Si comportano come il tipo (). Risultano utili quando occorre implementare dei comportamenti (trait) su un tipo senza memorizzarvi dati.

Prova tu

Esercizio#rust.m4.l1.e1
Tentativi: 0Caricamento…

Definisci la struct User sopra il main con i campi: username (di tipo String) e active (di tipo bool).

Caricamento editor…
Mostra suggerimento

Scrivi `struct User { username: String, active: bool }`prima del`main`.

Soluzione disponibile dopo 3 tentativi

Esercizio#rust.m4.l1.e2
Tentativi: 0Caricamento…

Modifica user1 rendendola mutabile (let mut user1) e cambia il campo active a false prima della stampa.

Caricamento editor…
Mostra suggerimento

Aggiungi `mut`a`let user1`per farla diventare`let mut user1`, poi inserisci `user1.active = false;`.

Soluzione disponibile dopo 3 tentativi

Esercizio#rust.m4.l1.e3
Tentativi: 0Caricamento…

Definisci una tuple struct chiamata Color contenente tre campi interi i32. Nel main, istanzia Color con i valori 255, 0 e 100 assegnandola alla variabile my_color, quindi stampane il primo elemento (valore rosso) usando println!.

Caricamento editor…
Mostra suggerimento

Definisci la tuple struct con `struct Color(i32, i32, i32);`. Nel main, istanziala come `let my_color = Color(255, 0, 100);`e stampa il valore rosso con`my_color.0`.

Soluzione disponibile dopo 3 tentativi