Fonctions associées
Fait partie de la section Object Oriented Programming du Journey Rust de Coddy — leçon 4 sur 61.
Toutes les fonctions d'un bloc impl n'ont pas besoin d'opérer sur une instance existante. Les fonctions qui ne prennent pas self comme paramètre sont appelées fonctions associées — elles sont associées au type lui-même plutôt qu'à une instance particulière.
L'utilisation la plus courante des fonctions associées est la création de constructeurs. Par convention, ceux-ci sont souvent nommés new :
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Remarquez qu'il n'y a pas de paramètre self — cette fonction n'a pas besoin d'un Player existant pour fonctionner. À la place, elle en crée et en retourne un tout nouveau. Le type de retour est la structure elle-même.
Pour appeler une fonction associée, utilisez la syntaxe :: avec le nom du type au lieu de la notation par point :
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// Sortie : Alice commence avec 0 point
}
Ce pattern offre un moyen propre d'initialiser des structs avec des valeurs par défaut ou une logique de validation, en gardant la logique de création regroupée avec la définition du type. Vous avez probablement déjà vu cette syntaxe avec String::from() — c'est aussi une fonction associée !
Défi
FacileCréez une structure Book avec deux champs : title (String) et pages (u32).
Ajoutez un bloc d'implémentation pour Book avec une fonction associée appelée new qui :
- Prend un paramètre
title: String - Renvoie un nouveau
Bookavec le titre donné etpagesdéfini sur0
Ajoutez également une méthode appelée info qui prend &self et renvoie une String au format : "{title} has {pages} pages"
Vous recevrez une entrée :
- Le titre du livre (String)
Utilisez la fonction associée Book::new pour créer un livre avec le titre fourni, puis affichez le résultat de l'appel à la méthode info.
Format de sortie attendu :
{title} has {pages} pagesAide-mémoire
Les fonctions dans un bloc impl qui ne prennent pas self comme paramètre sont appelées des fonctions associées. Elles sont associées au type lui-même plutôt qu'à une instance particulière.
Les fonctions associées sont couramment utilisées comme constructeurs, généralement nommées new :
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Pour appeler une fonction associée, utilisez la syntaxe :: avec le nom du type :
let player1 = Player::new(String::from("Alice"));
String::from() est un exemple de fonction associée que vous avez déjà utilisée.
Essayez vous-même
use std::io;
// TODO: Définir la structure Book avec les champs title (String) et pages (u32)
// TODO: Ajouter un bloc impl pour Book avec :
// - Une fonction associée `new` qui prend un titre et retourne un Book avec pages initialisé à 0
// - Une méthode `info` qui retourne une String au format "{title} has {pages} pages"
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let title = input.trim().to_string();
// TODO: Utiliser Book::new pour créer un livre avec le titre fourni
// TODO: Afficher le résultat de l'appel à la méthode info
}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