Menu
Coddy logo textTech

Guia rápido de Luau

Modos de verificação de tipos

Um comentário na primeira linha do arquivo define o rigor da verificação.

ModoSintaxe
Sem verificação de tipos--!nocheck
Padrão: verifica o que foi anotado--!nonstrict
Estrito: infere e verifica tudo--!strict
Executar um arquivoluau main.luau
Verificar tipos sem executarluau-analyze main.luau
Desligar um aviso do linter--!nolint UnknownGlobal

Tipos básicos

Os tipos primitivos e como anotar uma variável.

OperaçãoSintaxe
Númerolocal age: number = 25
Stringlocal name: string = "Ada"
Booleanolocal ok: boolean = true
Opcional (pode ser nil)local nick: string? = nil
Any (sem verificação)local x: any = f()
Unknown (any mais seguro)local x: unknown = f()
Never (sempre lança erro)function fail(): never error("boom") end
Nillocal n: nil = nil
Corrotina / bufferlocal co: thread, local b: buffer
Inferido: sem anotaçãolocal hp = 100 -- number

Tabelas tipadas: arrays e mapas

Continuam sendo tabelas Lua; o tipo diz o que há dentro.

OperaçãoSintaxe
Array de númeroslocal xs: {number} = {1, 2, 3}
Array de stringslocal names: {string} = {}
Mapa (chaves string)local ages: {[string]: number} = {}
Mapa (qualquer tipo de chave)local seen: {[Player]: boolean} = {}
Array aninhadolocal grid: {{number}} = {}
Array de formatoslocal items: {{id: number}} = {}
Array somente leituralocal t = table.freeze({1, 2, 3})
Iterar (generalizado, só Luau)for i, v in xs do print(i, v) end
Iterar chaves e valoresfor k, v in pairs(ages) do end

Funções

Anote parâmetros e o tipo de retorno; -> () significa que não retorna nada.

OperaçãoSintaxe
Parâmetros e retorno tipadosfunction add(a: number, b: number): number
Não retorna nadafunction log(msg: string): () end
Retornos múltiplosfunction split(s: string): (string, string)
Parâmetro opcionalfunction greet(name: string?) end
Valor padrãofunction greet(name: string?) name = name or "friend" end
Variádicafunction sum(...: number): number end
Função anônimalocal f = function(x: number): number return x * 2 end
Tipo de funçãotype Adder = (number, number) -> number
Parâmetro de callbackfunction each(f: (number) -> ()) end

Aliases de tipo, uniões e literais

Nomeie um tipo uma vez e reutilize em todo lugar.

OperaçãoSintaxe
Alias de um primitivotype Health = number
Uniãotype Id = number | string
Opcional = união com niltype Maybe = string | nil -- same as string?
Tipo literal (singleton)type Dir = "up" | "down"
Interseçãotype Both = Named & Aged
Alias genéricotype List<T> = {T}
Exportar de um móduloexport type Point = { x: number, y: number }
Tipo de um valor existentetype Config = typeof(config)
Chaves de um tipo de tabelatype K = keyof<Point>

Formatos de tabela e métodos

Descrevendo objetos, e o self que vem com as chamadas com dois-pontos.

OperaçãoSintaxe
Formato inlinelocal p: { x: number, y: number } = { x = 0, y = 0 }
Formato nomeadotype Point = { x: number, y: number }
Propriedade opcionaltype User = { name: string, age: number? }
Formato + indexadortype Bag = { count: number, [string]: any }
Estender um formatotype Admin = User & { level: number }
Método (atalho com dois-pontos)function Point.move(self: Point, dx: number) end
Método em um tipotype Point = { move: (self: Point, dx: number) -> () }
Padrão de construtorfunction Point.new(x: number): Point end
Constantes congeladas (tipo enum)local Color = table.freeze({ Red = 1, Blue = 2 })

Genéricos

Uma função ou tipo que serve para muitos tipos de valor.

OperaçãoSintaxe
Função genéricafunction id<T>(x: T): T return x end
Dois parâmetros de tipofunction pair<A, B>(a: A, b: B): (A, B) end
Genérica sobre um arrayfunction first<T>(xs: {T}): T? return xs[1] end
Alias de tipo genéricotype Stack<T> = { items: {T} }
Instanciar um aliaslocal s: Stack<string> = { items = {} }
Função map genéricafunction map<T, U>(xs: {T}, f: (T) -> U): {U} end
Pacote genérico (variádico)function call<T...>(f: () -> T...): T... end

Estreitamento, asserções e guards

Convencer o verificador de que um valor é o que você já sabe.

OperaçãoSintaxe
Asserção de tipo (cast)local n = value :: number
Asserção passando por anylocal n = (value :: any) :: number
Estreitar com typeofif typeof(x) == "string" then -- x é string end
Estreitar um opcionalif name then print(#name) end
Retorno antecipado se for nilif not name then return end
Estreitar uma união literalif dir == "up" then end
Checagem em tempo de execuçãoassert(typeof(id) == "number", "id must be a number")
Garantir que não é nil e usarlocal item = assert(find(id), "missing item")

Operadores e sintaxe que o Lua não tem

As melhorias do dia a dia - é aqui que o código Luau para de parecer Lua.

OperaçãoSintaxe
Somar e atribuirhp += 10
Subtrair / multiplicar / dividirhp -= 5, dmg *= 2, dmg /= 2
Divisão inteira e atribuiçãon //= 2
Módulo / potência e atribuiçãon %= 3, n ^= 2
Concatenar e atribuirmsg ..= "!"
Divisão inteiralocal half = 7 // 2 -- 3
Interpolação de stringsHello, {name}! You have {n} items. (entre acentos graves)
Interpolar uma expressãoTotal: {price * qty} (entre acentos graves)
Continuar um laçofor _, v in xs do if v < 0 then continue end end
Expressão if-then-elselocal label = if hp > 0 then "alive" else "dead"
Expressão com else-if em cadeialocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
Literais binários / com separador0b1010, 1_000_000

Extras da biblioteca e diferenças do Lua

Funções que o Luau adiciona à biblioteca padrão e recursos do Lua que ele remove.

ItemDetalhe
Encontrar um valor em um arraytable.find(xs, 42) -- índice ou nil
Cópia rasalocal copy = table.clone(t)
Tornar imutável / verificartable.freeze(t), table.isfrozen(t)
Prealocar um arraytable.create(10, 0)
Clamp / round / signmath.clamp(x, 0, 1), math.round(x), math.sign(x)
Operações de bitsbit32.band(a, b), bit32.lshift(a, 1)
Removido por isolamentoio, package, loadstring, loadfile, dofile
Obsoleto mas ainda presentegetfenv, setfenv (desativam otimizações)
Não existe no Luaugoto / rótulos (o Luau se baseia no Lua 5.1)
Ler stdin na Coddyio.read() funciona aqui: a Coddy o restaura sobre o Luau
Extensão de arquivomain.luau (.lua também funciona)
Só no Roblox, não no Luau basegame, workspace, Instance.new, task.wait

Luau é o Lua 5.1 mais um sistema de tipos gradual - a linguagem que a Roblox criou e abriu o código. Este guia cobre o que *não* é Lua puro: anotações de tipo, tabelas tipadas, uniões e tipos literais, genéricos, asserções de tipo e o açúcar sintático que o Luau adiciona (+=, interpolação de strings, continue, expressões if-then-else). Para tudo o que as duas linguagens têm em comum - tabelas, metatabelas, corrotinas, a biblioteca de strings - mantenha o guia rápido de Lua ao lado.

Tudo aqui é Luau padrão, executável com a CLI luau e verificável com luau-analyze. Copie o que precisar ou teste ao vivo no playground de Luau - sem instalar nada. Começando no sistema de tipos? O curso interativo gratuito de Luau da Coddy constrói tudo lição por lição.

FAQ do guia rápido de Luau

Este guia rápido de Luau é grátis?
Sim. Este guia rápido de Luau é totalmente gratuito e não exige cadastro. Salve nos favoritos para a próxima vez que precisar da sintaxe de uma união, de um genérico ou de uma tabela tipada.
O Luau tem o operador +=?
Sim. Diferente do Lua puro, o Luau tem atribuição composta: +=, -=, *=, /=, //=, %=, ^= e ..= para concatenar strings. Então hp += 10 é Luau válido (e código válido do Roblox), enquanto no Lua 5.1 você precisa escrever hp = hp + 10. Atenção: não existem ++ nem -- no Luau.
Qual é a diferença entre Lua e Luau?
Luau é um superconjunto do Lua 5.1 com um sistema de tipos gradual. Além dos tipos, ele adiciona interpolação de strings com acentos graves, operadores de atribuição composta, continue, expressões if-then-else, divisão inteira //, iteração generalizada (for i, v in t do) e funções como table.find, table.clone e table.freeze. Por isolamento, remove loadstring, loadfile, dofile e as bibliotecas io e package, e não tem goto porque se baseia no 5.1. A maior parte do código Lua comum roda sem alterações como Luau.
Como ligo a verificação de tipos no Luau?
Coloque um comentário de modo na primeira linha do arquivo: --!strict verifica tudo e infere agressivamente, --!nonstrict (o padrão) só verifica o que você anotou e --!nocheck desliga a verificação. Fora do editor, rode luau-analyze main.luau para verificar tipos sem executar e luau main.luau para executar.
Escrevo interface no Luau como no TypeScript?
Não - o Luau não tem a palavra-chave interface. Formatos de objeto são escritos como tipos de tabela e nomeados com type: type User = { name: string, age: number? }. Combine formatos com & em vez de extends e use export type para disponibilizá-los a outros módulos.
Este guia é a mesma coisa que scripting no Roblox?
Tudo aqui é Luau base - a linguagem - então vale igual para scripts do Roblox e para Luau independente. O que *não* está aqui é a API do motor do Roblox (game, workspace, Instance.new, serviços, eventos), que é uma biblioteca sobre a linguagem e é documentada pela Roblox, não pelo Luau.
Onde posso rodar estes trechos de Luau?
No playground de Luau - ele roda o interpretador luau real no navegador, com suporte a stdin, então você pode colar qualquer linha desta página e clicar em Executar. Para prática estruturada, o curso interativo de Luau cobre o mesmo material com exercícios, projetos e certificado.
Coddy programming languages illustration

Aprenda Luau com a Coddy

COMEÇAR