Le mot-clé public
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 9 sur 61.
Dans la leçon précédente, vous avez appris à organiser le code dans des fichiers de modules séparés. Cependant, si vous essayiez d'utiliser la Player struct de main.rs, vous rencontreriez une erreur de compilation. C'est parce que tout dans un module Rust est privé par défaut.
Pour rendre les éléments accessibles depuis l'extérieur de leur module, vous devez les marquer explicitement avec le mot-clé pub :
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Remarquez comment pub apparaît à plusieurs endroits — sur la structure elle-même, sur chaque champ et sur la méthode. Chaque élément nécessite sa propre déclaration de visibilité.
Sans pub sur la struct, les autres fichiers ne peuvent même pas nommer le type. Sans pub sur les champs, ils ne peuvent pas accéder directement aux données. Sans pub sur les méthodes, ils ne peuvent pas les appeler.
Maintenant, dans main.rs, vous pouvez utiliser les éléments publics du module :
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
L'instruction use rend Player accessible dans la portée afin que vous n'ayez pas à écrire player::Player à chaque fois. Cette approche de confidentialité par défaut est intentionnelle — elle vous encourage à réfléchir soigneusement aux parties de votre code qui doivent être exposées au monde extérieur.
Défi
FacileConstruisons un catalogue de produits simple en organisant votre code sur deux fichiers et en rendant les bons éléments publics afin qu'ils puissent être utilisés depuis votre programme principal.
Vous allez créer deux fichiers :
product.rs: Définissez une structureProductavec deux champs :name(String) etprice(f64). Ajoutez une fonction associée appeléenewqui prend un nom et un prix et retourne un nouveauProduct. N'oubliez pas de marquer la structure, ses champs et la méthode comme publics afin qu'ils puissent être consultés depuis l'extérieur du module.main.rs: Déclarez le module product, importezProductdans la portée avec une instructionuse, puis créez un produit et affichez ses détails.
Réfléchissez bien à l'endroit où vous avez besoin du mot-clé pub — la structure elle-même doit être visible, les champs doivent être accessibles en lecture, et la méthode constructeur doit pouvoir être appelée depuis main.rs.
Votre sortie doit suivre exactement ce format :
Product: {name}, Price: ${price}Par exemple, si vous créez un produit avec le nom "Laptop" et le prix 999.99, la sortie sera :
Product: Laptop, Price: $999.99Vous recevrez deux entrées : le nom du produit et le prix.
Aide-mémoire
En Rust, tout ce qui se trouve dans un module est privé par défaut. Pour rendre les éléments accessibles depuis l'extérieur de leur module, utilisez le mot-clé pub.
Marquez les structures, les champs et les méthodes comme publics :
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Chaque élément nécessite sa propre déclaration de visibilité :
pubsur la structure rend le type visiblepubsur les champs permet un accès direct aux donnéespubsur les méthodes permet de les appeler
Utilisez l'instruction use pour importer des éléments dans la portée :
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
Essayez vous-même
// Déclarer le module product
mod product;
// TODO: Mettre Product dans la portée avec une instruction use
fn main() {
// Lire l'entrée
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: Créer un nouveau Product en utilisant la fonction Product::new
// TODO: Afficher les détails du produit au format :
// Product: {name}, Price: ${price}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Méthodes et comportement
Introduction aux blocs d'implémentationLe paramètre SelfMéthodes mutablesFonctions associéesBlocs d'implémentation multiplesChaînage de méthodesRécapitulatif - Actions sur le rectangle4Projet : Animal virtuel
Définir l'animalNourrir l'animal7Traits standards
Le trait DebugLe trait DisplayClone et CopyLes traits d'égalitéRécapitulatif - Point affichable10Projet : Système de documents
Le trait DrawComposant texte2Encapsulation et modules
Bases des modulesLe mot-clé publicChamps privésGettersSettersRécapitulatif - Casier sécurisé5Généricité
Structures génériquesMéthodes génériquesPlusieurs types génériquesFonctions génériquesRécapitulatif - Point de coordonnées8Les Traits comme contraintes
Syntaxe des contraintes de traitContraintes multiplesLa clause whereRetourner des types avec des traitsRécapitulatif - Afficheur générique11Design Patterns en Rust
Le pattern NewtypeCompositionLe trait DropFrom et IntoRécapitulatif - Mock de Smart Pointer3Enums avancées
Enums avec donnéesMéthodes sur les EnumsMatching des variantes de donnéesL'Enum Option revisitéeRécapitulatif - Enum Shape6Définition des Traits
Qu'est-ce qu'un Trait ?Implémenter des TraitsImplémentations par défautRedéfinir les comportements par défautTraits avec paramètresRécapitulatif - Lecteur multimédia