Menu
CoddyTech

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
end

Observe 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.

challenge icon

Desafio

Fácil

Anexe dois métodos a uma conta usando a sintaxe com dois-pontos.

  1. Abaixo da tabela, defina function account:deposit(amount: number) que adiciona amount a self.balance.
  2. Defina function account:getBalance(): number que retorna self.balance.
  3. Imprima account:getBalance(), chame account:deposit(120) e, em seguida, imprima account: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

Pratique por conta própria: Compilador de Luau online