Usando uma Função Genérica
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 63 de 80.
Você nunca informa a identity o que é T: o verificador descobre isso por conta própria. Isso é inferência de tipos: em cada ponto de chamada, Luau analisa o argumento e determina T:
local word = identity("Luau") -- T inferido como string
local count = identity(12) -- T inferido como number
local flag = identity(false) -- T inferido como booleanCada chamada é independente: T pode ser uma string em uma linha e um número na seguinte. O resultado inferido é tão seguro quanto uma anotação escrita manualmente: para o verificador, word é uma string, com preenchimento automático completo e verificação de erros.
Uma diferença importante em relação ao TypeScript: o TS permite forçar o tipo no ponto de chamada com identity<number>(5). Luau não tem argumentos de tipo no ponto de chamada. Essa linha não é uma sintaxe especial, então Luau interpreta os sinais de menor e maior como operadores de comparação e o código falha. Quando quiser especificar o tipo explicitamente, anote a variável em vez disso:
local count: number = identity(12)Você pode ver a inferência em ação com uma ferramenta conhecida: typeof retorna o nome do tipo de tempo de execução de um valor, então print(typeof(identity(12))) imprime number: o valor passou pela função genérica completamente inalterado.
Desafio
FácilDeixe o verificador determinar T em cada chamada.
- Abaixo da função, armazene
identity("Oslo")emlocal cityeidentity(42)emlocal floors, sem anotações. - Imprima
typeof(city)e, em seguida,typeof(floors).
Pressione Executar código: a saída mostra string e number.
Experimente você mesmo
-- A função genérica identity da aula anterior
local function identity<T>(value: T): T
return value
end
-- 1) city e floors obtidos de chamadas a identity, sem anotações
-- 2) imprima o typeof de cada um
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