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 lá atrás em OOP com Lua: os dois-pontos. rect:area() é exatamente a mesma chamada: Lua passa a tabela antes dos dois-pontos como o primeiro argumento, self, automaticamente.
Os dois-pontos também ajudam no local da 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 ainda está 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êntica a account.deposit(account, 250). O mesmo comportamento em tempo de execução do seu capítulo de OOP: Luau apenas adiciona tipos por cima.
Desafio
FácilCrie um alias de tipo 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, em seguida, associe ambos os métodos usando a sintaxe de definição com dois-pontos (function account:deposit(amount: number) …). deposit adiciona amount ao saldo; getBalance retorna o saldo atual.
Usando chamadas com dois-pontos:
- imprima o saldo
- deposite
250 - imprima o saldo novamente
- imprima o proprietário
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 a sintaxe de dois-pontos
-- 3) imprima o saldo, deposite 250, imprima o saldo 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