Il problema risolto dai generics
Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 61 di 80.
Immagina di aver bisogno di una funzione che restituisca semplicemente qualsiasi valore le venga passato: una funzione identità. Con i tipi che conosci finora, hai due opzioni, ed entrambe sono problematiche.
Prima opzione: scrivere una copia separata per ogni tipo. I corpi sono identici; cambiano solo le annotazioni:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endOgni nuovo tipo significa un'altra copia, e un bug corretto in una deve essere corretto in tutte. È proprio questo tipo di duplicazione che scrivi funzioni per evitare.
Seconda opzione: riunirle in un'unica funzione tipizzata con any:
local function echo(value: any): any
return value
endOra una sola funzione gestisce tutto, ma hai sacrificato la sicurezza dei tipi. Quando chiami echo("hello"), il verificatore non sa più che il risultato è una stringa. Sa solo che è any, quindi il completamento automatico non è più disponibile e gli errori di tipo passano inosservati: si perde il collegamento tra ciò che entra e ciò che esce.
Quello che vuoi davvero è una funzione che funzioni con ogni tipo e ricordi quale tipo è stato usato per ogni chiamata. È proprio ciò che offrono i generici, e sono l'argomento di questo capitolo.
Sfida
FacileScopri cosa dimentica la versione di echo con any.
- Scrivi
local function echo(value: any): anyche restituiscavalue. - Memorizza
echo("hello")inlocal result. - Stampa
result, poitypeof(result).
Premi Esegui codice: l'output mostra hello e string.
Provalo tu
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) stampa result e typeof(result)
Tutte le lezioni di Introduzione a Luau
1Per iniziare con Luau
Che cos'è Luau?Perché usare Luau?Il tuo primo codice LuauVerifica dei tipi e modalità di erroreRiepilogo: introduzione a Luau4Lavorare con le funzioni
Tipizzare parametri e valori restituitiTipizzare le funzioni anonimeFunzioni che non restituiscono nullaParametri opzionaliValori predefiniti dei parametriValori predefiniti per i booleaniFunzioni variadicheDefinire i tipi di funzioneRiepilogo: funzioni tipizzate7Progetto: Gestore di attività tipizzato
Progetto: La struttura di un'attivitàFunzione per aggiungere un'attività2Tipi fondamentali
Numero, stringa e booleanoIl tipo 'any': una via di fugaIl tipo 'unknown'Tipi nil e opzionaliL’inferenza dei tipi in praticaAnnotazioni esplicite dei tipiRipasso: esercizi sui tipi fondamentali5Alias, unioni e intersezioni
Alias di tipo per i primitiviTipi unioneLavorare con i tipi unioneTipi letteraliTipi intersezioneCombinare gli alias di tipoRiepilogo: combinazioni avanzate di tipi3Tabelle tipizzate: array e mappe
Array tipizzatiAggiungere e leggere elementiChe cos'è un tipo map?Dichiarare e accedere alle mappeIterare sulle tabelleTabelle con forme misteLeggere una grigliaCreare una grigliatable.unpackRiepilogo: array e mappe6Tipizzare le forme delle tabelle
Annotazioni inline delle formeAlias di tipo per le formeProprietà opzionaliForme e tabelle libere a confrontoEstendere le formeAggiungere metodi alle formeSelf e metodi con i due puntiRiepilogo: definire le forme delle tabelle9Generics: una prima occhiata
Il problema risolto dai genericsUna funzione identità genericaUsare una funzione genericaArray genericiAlias di tipo genericiRiepilogo: funzioni genericheEsercitati da solo: Compilatore Luau online