Menu
Coddy logo textTech

Riepilogo - Stampante generica

Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 44 di 61.

challenge icon

Sfida

Facile

Costruiamo un sistema di annunci flessibile che dimostri la potenza dei vincoli sui trait! Creerai un trait Printable e una funzione generica che può annunciare qualsiasi tipo che implementi questo trait: vedrai come generics e trait collaborano per creare codice riutilizzabile e sicuro rispetto ai tipi.

Organizzerai il codice in due file:

  • printable.rs: Definisci un trait pubblico Printable con un metodo print_info che accetta &self e restituisce una String. Poi crea una funzione generica pubblica chiamata announce che accetta qualsiasi tipo T che implementi Printable. Questa funzione dovrebbe stampare Announcement: {info}, dove {info} è il risultato della chiamata a print_info() sull'elemento.
  • main.rs: Crea due struct pubbliche che implementano Printable:
    • Person: con un campo pubblico name (String). Il suo metodo print_info dovrebbe restituire Person: {name}
    • Product: con i campi pubblici name (String) e price (f64). Il suo metodo print_info dovrebbe restituire Product: {name} - ${price}
    Includi il modulo printable, usa gli input per creare una Person e un Product, quindi chiama announce con ciascuno per dimostrare che la tua funzione generica funziona con qualsiasi tipo Printable.

La bellezza di questo design è che announce non si preoccupa di ricevere una Person, un Product o qualsiasi tipo futuro. Richiede solo che il tipo possa fornire informazioni tramite print_info(). Il vincolo del trait lo garantisce al momento della compilazione.

L'output dovrebbe mostrare entrambi gli annunci:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

Ad esempio, con gli input Alice, Laptop e 999.99:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

Riceverai tre input: il nome della persona, il nome del prodotto e il prezzo del prodotto (da analizzare come f64).

Provalo tu

mod printable;

use printable::{Printable, announce};

// TODO: Definisci una struct pubblica Person con un campo pubblico name (String)
// Implementa il trait Printable per Person
// print_info dovrebbe restituire "Person: {name}"

// TODO: Definisci una struct pubblica Product con i campi pubblici name (String) e price (f64)
// Implementa il trait Printable per Product
// print_info dovrebbe restituire "Product: {name} - ${price}"

fn main() {
    // Leggi gli input
    let mut person_name = String::new();
    std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
    let person_name = person_name.trim().to_string();

    let mut product_name = String::new();
    std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_name.trim().to_string();

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: Crea un'istanza di Person con person_name

    // TODO: Crea un'istanza di Product con product_name e price

    // TODO: Chiama announce con Person

    // TODO: Chiama announce con Product
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Rust online