Self e Métodos com Dois Pontos
Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 43 de 73.
Escrever rect.area(rect) funciona, mas você aprendeu uma maneira melhor no módulo de OOP em Lua: os dois-pontos (colon). rect:area() é exatamente a mesma chamada — a Lua passa a table antes dos dois-pontos como o primeiro argumento, self, automatically.
Os dois-pontos também ajudam no local de definição. function account:deposit(amount) declara um primeiro parâmetro oculto chamado self para você:
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Maya", balance = 1500}
function account:deposit(amount: number)
self.balance += amount -- self é implícito
end
function account:getBalance(): number
return self.balance
endNote como a estrutura declara self explicitly — deposit: (self: Account, amount: number) -> () — mesmo que o colon o esconda na implementação. O colon é apenas um atalho sintático (syntax sugar); o parâmetro ainda está lá, e o type o especifica. Um método que não retorna nada é tipado com o return vazio -> ().
A chamada segue a mesma regra que você já conhece: account:deposit(250) é idêntico a account.deposit(account, 250). O mesmo comportamento em tempo de execução do seu capítulo de OOP — o Luau apenas adiciona tipos por cima.
Desafio
FácilCrie um type alias chamado Account com:
ownerdo tipostringbalancedo tiponumberdeposit—(self: Account, amount: number) -> ()getBalance—(self: Account) -> number
Crie uma tabela account com owner "Maya" e balance 1500, e depois anexe ambos os métodos usando a sintaxe de colon definition (function account:deposit(amount: number) …). deposit adiciona amount ao balance; getBalance retorna o balance atual.
Usando colon calls:
- imprima o balance
- faça um deposit de
250 - imprima o balance novamente
- imprima o owner
Experimente você mesmo
-- Escreva o código aqui
-- 1) defina o tipo Account (métodos recebem self explicitamente no tipo)
-- 2) crie a tabela account, depois anexe deposit/getBalance com sintaxe de dois pontos
-- 3) imprima o balance, deposite 250, imprima o balance novamente, imprima o owner
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, 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 MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: 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 Tabelas