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 TabelasPratique por conta própria: Compilador de Lua online