Menu
CoddyTech

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. O curso Roblox Game Scripting ensina essa API com scripts que rodam em um pequeno jogo no estilo Roblox no seu navegador.
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.
Ilustração das linguagens de programação do Coddy

Aprenda Luau com a Coddy

Começar