Menu
CoddyTech

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
end

Ogni 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
end

Ora 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.

challenge icon

Sfida

Facile

Scopri cosa dimentica la versione di echo con any.

  1. Scrivi local function echo(value: any): any che restituisca value.
  2. Memorizza echo("hello") in local result.
  3. Stampa result, poi typeof(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

Esercitati da solo: Compilatore Luau online