Self e Métodos com Dois Pontos
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 45 de 80.
Escrever rect.area(rect) funciona, mas você aprendeu um jeito melhor lá atrás, em OOP com Lua: os dois-pontos. rect:area() é exatamente a mesma chamada: Lua passa automaticamente a tabela antes dos dois-pontos como o primeiro argumento, self.
Os dois-pontos também ajudam na definição. function account:deposit(amount) declara para você um primeiro parâmetro oculto chamado self:
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
endObserve como a estrutura declara self explicitamente, deposit: (self: Account, amount: number) -> (), embora os dois-pontos o ocultem na implementação. Os dois-pontos são apenas açúcar sintático; o parâmetro continua lá, e o tipo o explicita. Um método que não retorna nada é tipado com o retorno 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 capítulo de OOP: Luau apenas adiciona tipos por cima.
Observe que account não recebe uma anotação. O tipo Account descreve a tabela completa, e a tabela só corresponde a ele quando os dois métodos são adicionados; local account: Account = {owner = "Maya", balance = 1500} faria o modo estrito indicar que faltam os métodos.
Desafio
FácilAnexe dois métodos a uma conta usando a sintaxe com dois-pontos.
- Abaixo da tabela, defina
function account:deposit(amount: number)que adicionaamountaself.balance. - Defina
function account:getBalance(): numberque retornaself.balance. - Imprima
account:getBalance(), chameaccount:deposit(120)e, em seguida, imprimaaccount:getBalance()novamente.
Pressione Executar código: a saída mostra 300 e depois 420.
Experimente você mesmo
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Noah", balance = 300}
-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) imprima o saldo, deposite 120 e imprima o saldo novamente
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
Tipagem de parâmetros e valores de retornoTipagem de funções anônimasFunções sem retornoParâmetros opcionaisValores padrão dos parâmetrosValores padrão para booleanosFunções variádicasDefinindo tipos de funçãoRecapitulação: funções tipadas2Tipos básicos
Número, string e booleanoO tipo 'any': válvula de escapeO tipo 'unknown'Tipos nulos e opcionaisInferência de tipos na práticaAnotações explícitas de tipoRevisão: prática com tipos básicos5Aliases, 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 MapsPercorrendo TabelasTabelas com Formatos MistosLendo uma GradeConstruindo uma Gradetable.unpackRevisão: 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 Luau online