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éricasPratique por conta própria: Compilador de Lua online