El problema que resuelven los genéricos
Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 61 de 80.
Imagina que necesitas una función que simplemente devuelva cualquier valor que le pases: una función de identidad. Con los tipos que conoces hasta ahora, tienes dos opciones, y ambas son problemáticas.
Opción uno: escribir una copia por separado para cada tipo. Los cuerpos son idénticos; solo cambian las anotaciones:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endCada tipo nuevo significa otra copia, y un error que se corrige en una debe corregirse en todas. Eso es precisamente la duplicación que escribes funciones para evitar.
Opción dos: combinarlas en una sola función tipada con any:
local function echo(value: any): any
return value
endAhora una sola función se encarga de todo, pero has sacrificado la seguridad de tipos. Cuando llamas a echo("hello"), el verificador ya no sabe que el resultado es una cadena. Solo conoce any, así que el autocompletado deja de funcionar y se cuelan errores de tipos: se pierde la conexión entre lo que entra y lo que sale.
Lo que realmente quieres es una función que funcione con todos los tipos y recuerde qué tipo se usó en cada llamada. Eso es precisamente lo que ofrecen los genéricos, y son el tema de este capítulo.
Desafío
FácilObserva qué olvida la versión any de echo.
- Escribe
local function echo(value: any): anyque devuelvavalue. - Guarda
echo("hello")enlocal result. - Imprime
resulty despuéstypeof(result).
Pulsa Ejecutar código: el resultado muestra hello y string.
Pruébalo tú mismo
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) imprime result y typeof(result)
Todas las lecciones de Introducción a Luau
1Primeros pasos con Luau
¿Qué es Luau?¿Por qué usar Luau?Tu primer código en LuauComprobación de tipos y modos de errorRecapitulacion: Introducción a Luau4Trabajar con funciones
Tipado de parámetros y valores de retornoTipado de funciones anónimasFunciones que no devuelven nadaParámetros opcionalesValores predeterminados de parámetrosValores predeterminados para booleanosFunciones variádicasDefinir tipos de funcionesRepaso: funciones tipadas7Proyecto: Gestor de tareas tipado
Proyecto: La estructura de una tareaFunción para añadir una tarea2Tipos fundamentales
Número, cadena y booleanoEl tipo 'any': una salida de emergenciaEl tipo 'unknown'Tipos nulos y opcionalesLa inferencia de tipos en acciónAnotaciones de tipo explícitasRepaso: práctica de tipos fundamentales5Alias, Uniones e Intersecciones
Alias de tipos para primitivosTipos de uniónTrabajando con tipos de uniónTipos literalesTipos de intersecciónCombinando alias de tiposResumen: Combinaciones avanzadas de tipos3Tablas tipadas: arrays y mapas
Arrays tipadosAgregar y leer elementos¿Qué es un tipo mapa?Declarar y acceder a mapasRecorrer tablasTablas de formas mixtasLeer una cuadrículaConstruir una cuadrículatable.unpackRepaso: arrays y mapas6Definición de formas de tablas
Anotaciones de forma en líneaAlias de tipos para formasPropiedades opcionalesFormas frente a tablas no estructuradasExtensión de formasAñadir métodos a las formasEl parámetro 'self' y los métodos con dos puntosRecapitulación: Definición de formas de tablas9Genéricos: Una primera mirada
El problema que resuelven los genéricosUna función de identidad genéricaUso de una función genéricaArrays genéricosAlias de tipos genéricosResumen: Funciones genéricasPractica por tu cuenta: Compilador de Luau online