O Problema que Generics Resolvem
Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 57 de 73.
Imagine que você precisa de uma função que simplesmente retorne qualquer valor que você passar para ela — uma função de identidade. Com os tipos que você conhece até agora, você tem duas opções, e ambas são ruins.
Opção um: escrever uma cópia separada para cada tipo. Os corpos são idênticos; apenas as anotações mudam:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endCada novo tipo significa outra cópia, e um bug corrigido em uma deve ser corrigido em todas as outras. Essa é exatamente a duplicação que você escreve funções para evitar.
Opção dois: colapsá-las em uma única função tipada com any:
local function echo(value: any): any
return value
endAgora uma função lida com tudo — mas você pagou com a segurança de tipos. Quando você chama echo("hello"), o checker não sabe mais que o resultado é uma string. Ele só sabe any, então o autocompletar deixa de funcionar e os erros de tipo passam despercebidos: a conexão entre o que entrou e o que saiu é perdida.
O que você realmente quer é uma função que funcione para todo tipo e se lembre de qual tipo cada chamada usou. É precisamente isso que os genéricos oferecem a você — e eles são o assunto deste capítulo.
Experimente você mesmo
Esta lição não inclui um desafio de código.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, 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 MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: 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éricas