Le problème résolu par les génériques
Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 61 sur 80.
Imagine que tu as besoin d’une fonction qui renvoie simplement la valeur que tu lui transmets : une fonction identité. Avec les types que tu connais jusqu’ici, tu as deux options, et les deux sont pénibles.
Première option : écrire une copie distincte pour chaque type. Les corps sont identiques ; seules les annotations diffèrent :
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endChaque nouveau type implique une autre copie, et un bogue corrigé dans l’une doit l’être dans toutes. C’est précisément le genre de duplication que les fonctions sont censées éviter.
Deuxième option : les regrouper dans une seule fonction typée avec any :
local function echo(value: any): any
return value
endÀ présent, une seule fonction gère tout, mais tu as perdu la sûreté des types. Lorsque tu appelles echo("hello"), le vérificateur ne sait plus que le résultat est une chaîne. Il ne connaît que any, donc la saisie semi-automatique disparaît et les erreurs de type passent inaperçues : le lien entre ce qui est transmis à la fonction et ce qui en sort est perdu.
Ce que tu veux vraiment, c’est une fonction qui fonctionne avec tous les types et qui se souvient du type utilisé pour chaque appel. C’est précisément ce que permettent les génériques, et ils sont le sujet de ce chapitre.
Défi
FacileVoyez ce que la version any de echo oublie.
- Écrivez
local function echo(value: any): anyqui renvoievalue. - Stockez
echo("hello")danslocal result. - Affichez
result, puistypeof(result).
Appuyez sur Run Code : la sortie affiche hello et string.
Essayez vous-même
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) afficher result et typeof(result)
Toutes les leçons de Introduction à Luau
1Premiers pas avec Luau
Qu'est-ce que Luau ?Pourquoi utiliser Luau ?Votre premier code LuauVérification de type et modes d'erreurRécapitulatif : Introduction à Luau4Travailler avec les fonctions
Typer les paramètres et les valeurs de retourTyper les fonctions anonymesFonctions sans valeur de retourParamètres optionnelsValeurs par défaut des paramètresValeurs par défaut pour les booléensFonctions variadiquesDéfinir des types de fonctionsRécapitulatif : fonctions typées7Projet : gestionnaire de tâches typé
Projet : la structure d’une tâcheFonction pour ajouter une tâche2Types fondamentaux
Nombre, chaîne de caractères et booléenLe type « any » : une échappatoireLe type « unknown »Types nil et optionnelsL’inférence de types en actionAnnotations de type explicitesRécapitulatif : exercices sur les types fondamentaux5Alias, unions et intersections
Alias de types pour les types primitifsTypes unionsTravailler avec les types unionsTypes littérauxTypes intersectionsCombinaison d'alias de typesRécapitulatif : Combinaisons de types avancées3Tables typées : tableaux et maps
Tableaux typésAjouter et lire des élémentsQu’est-ce qu’un type Map ?Déclarer et accéder aux mapsParcourir les tablesTables de formes mixtesLire une grilleConstruire une grilletable.unpackRécapitulatif : tableaux et maps6Typage des structures de tables
Annotations de structures en ligneAlias de types pour les structuresPropriétés optionnellesStructures vs tables libresExtension de structuresAjout de méthodes aux structuresMéthodes avec Self et deux-pointsRécapitulatif : Définir des structures de tables9Les génériques : Un premier aperçu
Le problème résolu par les génériquesUne fonction d'identité génériqueUtiliser une fonction génériqueLes tableaux génériquesLes alias de types génériquesRécapitulatif : Les fonctions génériquesEntraînez-vous par vous-même : Compilateur Luau en ligne