Dans le développement logiciel, le filtrage par motif (pattern matching) ne se limite pas aux instructions de branchement complexes. Il s'invite également dans la syntaxe quotidienne des définitions de variables et des boucles for-in. Toutefois, ces structures imposent une contrainte majeure : elles ne supportent que les motifs irréfutables (irrefutable patterns).
Un motif est dit irréfutable s'il garantit une correspondance réussie pour n'importe quelle valeur du type cible. Voici une analyse détaillée des quatre catégories principales de motifs autorisés dans ces contextes.
1. Le motif joker : ignorer les données
Le caractère générique _ est utilisé pour signifier au compilateur que la valeur traitée ne sera pas utilisée. Cela permet de clarifier l'intention du code tout en évitant des avertissements sur des variables inutilisées.
Exemple de définition de variable :
main() {
let _ = "Donnée temporaire"; // Valeur jetée immédiatement
println("Opération terminée sans stockage.");
}
Exemple dans une boucle for-in :
main() {
// Exécuter une action un nombre fixe de fois sans utiliser l'index
for _ in 0..3 {
println("Action répétée");
}
}
2. Le motif de liaison : capture de valeur
Il s'agit de la forme la plus élémentaire où une valeur est associée à un identifiant unique. Puisqu'un nom de varible peut accepter n'importe quelle valeur de son type, ce motif est par nature irréfutable.
Exemple de définition de variable :
main() {
let score_final = 2500;
println("Le score est de : ${score_final}");
}
Exemple dans une boucle for-in :
main() {
let niveaux = [10, 20, 30];
for palier in niveaux {
println("Atteinte du palier : ${palier}");
}
}
3. Déstructuration de tuples
Le motif de tuple permet d'extraire simultanément plusieurs valeurs d'une structure groupée. Pour être irréfutable, la structure du motif doit correspondre exactement à l'arité du tuple d'origine.
Exemple de définition de variable :
main() {
let (largeur, hauteur) = (1920, 1080);
println("Résolution : ${largeur}x${hauteur}");
}
Exemple dans une boucle for-in :
main() {
let points = [(0, 0), (10, 5), (20, 10)];
for (posX, posY) in points {
println("Coordonnées : X=${posX}, Y=${posY}");
}
}
4. Motifs d'énumérations à variante unique
Lorsqu'une énumération ne possède qu'une seule variante possible, l'extraction de son contenu via un motif est considérée comme irréfutable car il n'existe aucune alternative pouvant mener à un échec.
Définition de l'énumération :
enum Identifiant {
ID(Int64)
}
Exemple d'extraction :
main() {
let Identifiant.ID(code) = Identifiant.ID(888);
println("Code extrait : ${code}");
let liste_id = [Identifiant.ID(1), Identifiant.ID(2)];
for Identifiant.ID(val) in liste_id {
println("Traitement de l'ID : ${val}");
}
}
L'importance de l'irréfutable
L'exigence de motifs irréftuables dans ces contextes repose sur la stabilité de l'exécution :
- Déclaration : Si une instruction
letpouvait échouer, le programme se retrouverait dans un état invalide où une variable déclarée n'aurait aucune donnée associée. - Itération : Une boucle
for-indoit pouvoir traiter chaque élément de la collection de manière uniforme. Un motif réfutable (comme unOption.Somedans une liste contenant desNone) provoquerait une rupture logique du flux.
Pour les cas où la correspondance est incertaine, il convient d'utiliser des structures dédiées à la gestion des motifs réfutables, telles que les expressions match ou les conditions if let.