Uma Função de Identidade Genérica
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 62 de 80.
Aqui está a função identidade feita do jeito certo, como uma função genérica:
local function identity<T>(value: T): T
return value
endO <T> depois do nome da função declara um parâmetro de tipo: um espaço reservado que representa “algum tipo, decidido a cada chamada”. Dentro da assinatura, você usa T exatamente como um tipo real: o parâmetro é um T, e a função retorna um T.
Usar o mesmo T para a entrada e a saída é todo o truque. Isso os vincula. Chame identity("hello") e o verificador determina T = string para essa chamada, então o resultado é uma string. Chame identity(42) e T = number, então o resultado é um number. Um corpo, todos os tipos, nada se perde.
T é apenas um nome convencional (abreviação de “Type”): <Item> ou <Value> funcionam igualmente bem. E, como sempre em Luau, os sinais de menor e maior existem apenas para o verificador: em tempo de execução, esta é a função Lua simples function identity(value) return value end.
Desafio
FácilEscreva uma função que retorne qualquer valor mantendo seu tipo intacto.
- Escreva
local function identity<T>(value: T): Tque retornevalue. - Declare
local luckyNumber: number = identity(7)elocal greeting: string = identity("Hello, Luau!"). - Imprima
luckyNumbere, em seguida,greeting.
Pressione Executar código: a saída mostra 7 e Hello, Luau!.
Experimente você mesmo
-- 1) identity<T>(value: T): T
-- 2) luckyNumber e greeting das chamadas de identity
-- 3) imprima ambos
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