O Problema que Generics Resolvem
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 61 de 80.
Imagine que você precisa de uma função que simplesmente retorna qualquer valor que você passar para ela: uma função identidade. Com os tipos que você conhece até agora, há duas opções, e ambas são problemáticas.
Opção um: escrever uma cópia separada para cada tipo. Os corpos são idênticos; apenas as anotações são diferentes:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endCada novo tipo significa mais uma cópia, e um bug corrigido em uma delas precisa ser corrigido em todas. É exatamente esse tipo de duplicação que você escreve funções para evitar.
Opção dois: juntar tudo em uma única função tipada com any:
local function echo(value: any): any
return value
endAgora uma única função dá conta de tudo, mas você pagou com segurança de tipos. Quando você chama echo("hello"), o verificador já não sabe que o resultado é uma string. Ele só conhece any, então o preenchimento automático deixa de funcionar e erros de tipo passam despercebidos: a conexão entre o que entrou e o que saiu se perde.
O que você realmente quer é uma função que funcione para todos os tipos e lembre qual tipo foi usado em cada chamada. É exatamente isso que os genéricos oferecem, e eles são o tema deste capítulo.
Desafio
FácilVeja o que a versão any de echo esquece.
- Escreva
local function echo(value: any): anyque retornavalue. - Armazene
echo("hello")emlocal result. - Imprima
resulte, em seguida,typeof(result).
Pressione Executar código: a saída mostra hello e string.
Experimente você mesmo
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) imprima result e typeof(result)
Todas as lições de Introdução ao Luau
1Começando com o Luau
O que é Luau?Por que usar Luau?Seu primeiro código em LuauVerificação de tipos e modos de erroRecapitulando: Introdução ao Luau4Trabalhando com funções
Tipagem de parâmetros e valores de retornoTipagem de funções anônimasFunções sem retornoParâmetros opcionaisValores padrão dos parâmetrosValores padrão para booleanosFunções variádicasDefinindo tipos de funçãoRecapitulação: funções tipadas2Tipos básicos
Número, string e booleanoO tipo 'any': válvula de escapeO tipo 'unknown'Tipos nulos e opcionaisInferência de tipos na práticaAnotações explícitas de tipoRevisão: prática com tipos básicos5Aliases, Uniões, Interseções
Aliases de Tipos para PrimitivosTipos de UniãoTrabalhando com Tipos de UniãoTipos LiteraisTipos de InterseçãoCombinando Aliases de TiposRecapitulando: Combinações Avançadas de Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsPercorrendo TabelasTabelas com Formatos MistosLendo uma GradeConstruindo uma Gradetable.unpackRevisão: Arrays e Maps6Tipando Formatos de Tabelas
Anotações de Formato InlineAliases de Tipo para FormatosPropriedades OpcionaisFormatos vs. Tabelas FlexíveisEstendendo FormatosAdicionando Métodos a FormatosSelf e Métodos com Dois PontosRecapitulação: Definindo Formatos de Tabelas9Generics: Uma Primeira Visão
O Problema que Generics ResolvemUma Função de Identidade GenéricaUsando uma Função GenéricaArrays GenéricosAliases de Tipos GenéricosRecapitulação: Funções GenéricasPratique por conta própria: Compilador de Luau online