La parola chiave public
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 9 di 61.
Nella lezione precedente hai imparato a organizzare il codice in file di moduli separati. Tuttavia, se provassi a usare la struct Player da main.rs, incontreresti un errore del compilatore. Questo perché, in un modulo Rust, tutto è privato per impostazione predefinita.
Per rendere gli elementi accessibili dall'esterno del loro modulo, devi contrassegnarli esplicitamente con la parola chiave pub:
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Nota come pub compaia in più punti: sulla struct stessa, su ogni campo e sul metodo. Ogni elemento ha bisogno della propria dichiarazione di visibilità.
Senza pub sulla struct, gli altri file non possono nemmeno fare riferimento al tipo. Senza pub sui campi, non possono accedere direttamente ai dati. Senza pub sui metodi, non possono chiamarli.
Ora, in main.rs, puoi usare gli elementi pubblici del modulo:
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
L'istruzione use rende Player disponibile nell'ambito, così non devi scrivere player::Player ogni volta. Questo approccio in cui la privacy è predefinita è intenzionale. Ti incoraggia a riflettere attentamente su quali parti del tuo codice dovrebbero essere esposte al mondo esterno.
Sfida
FacileCostruiamo un semplice catalogo di prodotti organizzando il codice in due file e rendendo pubblici gli elementi appropriati, in modo che possano essere usati dal programma principale.
Creerai due file:
product.rs: Definisci uno structProductcon due campi:name(String) eprice(f64). Aggiungi una funzione associata chiamatanewche accetta un nome e un prezzo e restituisce un nuovoProduct. Ricorda di contrassegnare lo struct, i suoi campi e il metodo come pubblici, in modo che siano accessibili dall'esterno del modulo.main.rs: Dichiara il modulo product, importaProductnell'ambito con un'istruzioneuse, poi crea un prodotto e stampa i suoi dettagli.
Rifletti attentamente su dove ti serve la parola chiave pub: lo struct stesso deve essere visibile, i campi devono essere accessibili in lettura e il metodo costruttore deve poter essere chiamato da main.rs.
L'output deve seguire esattamente questo formato:
Product: {name}, Price: ${price}Per esempio, se crei un prodotto con nome "Laptop" e prezzo 999.99, l'output sarà:
Product: Laptop, Price: $999.99Riceverai due valori in input: il nome del prodotto e il prezzo.
Provalo tu
// Dichiara il modulo product
mod product;
// TODO: Porta Product nell'ambito con un'istruzione use
fn main() {
// Leggi l'input
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = 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 nuovo Product usando la funzione Product::new
// TODO: Stampa i dettagli del prodotto nel formato:
// Product: {name}, Price: ${price}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online