Menu
CoddyTech

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
end

Cada 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
end

Agora 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.

challenge icon

Desafio

Fácil

Veja o que a versão any de echo esquece.

  1. Escreva local function echo(value: any): any que retorna value.
  2. Armazene echo("hello") em local result.
  3. Imprima result e, 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

Pratique por conta própria: Compilador de Luau online