Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 structure Product avec deux champs : name (String) et price (f64). Ajoutez une fonction associée appelée new qui prend un nom et un prix et retourne un nouveau Product. 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, importez Product dans la portée avec une instruction use, 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.99

Vous 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é :

  • pub sur la structure rend le type visible
  • pub sur les champs permet un accès direct aux données
  • pub sur 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}
}
quiz iconTestez-vous

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