Menu
CoddyTech

El parámetro 'self' y los métodos con dos puntos

Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 45 de 80.

Escribir rect.area(rect) funciona, pero aprendiste una forma mejor en la lección de POO de Lua: los dos puntos. rect:area() es exactamente la misma llamada: Lua pasa automáticamente la tabla anterior a los dos puntos como primer argumento, self.

Los dos puntos también ayudan al definir el método. function account:deposit(amount) declara por ti un primer parámetro oculto llamado 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 está implícito
end

function account:getBalance(): number
    return self.balance
end

Observa que la forma declara self explícitamente, deposit: (self: Account, amount: number) -> (), aunque los dos puntos lo ocultan en la implementación. Los dos puntos son azúcar sintáctico; el parámetro sigue estando ahí y el tipo lo especifica. Un método que no devuelve nada se tipa con el retorno vacío -> ().

Las llamadas siguen la misma regla que ya conoces: account:deposit(250) es idéntico a account.deposit(account, 250). El mismo comportamiento en tiempo de ejecución que en el capítulo de POO: Luau simplemente añade tipos.

Observa que account en sí no tiene anotación. El tipo Account describe la tabla completa, y la tabla solo coincide con él una vez que se han añadido ambos métodos; local account: Account = {owner = "Maya", balance = 1500} haría que el modo estricto informara de que faltan los métodos.

challenge icon

Desafío

Fácil

Asocia dos métodos a una cuenta con la sintaxis de dos puntos.

  1. Debajo de la tabla, define function account:deposit(amount: number), que suma amount a self.balance.
  2. Define function account:getBalance(): number, que devuelve self.balance.
  3. Imprime account:getBalance(), llama a account:deposit(120) y después vuelve a imprimir account:getBalance().

Pulsa Run Code: la salida muestra 300 y después 420.

Pruébalo tú mismo

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) imprime el saldo, deposita 120 y vuelve a imprimirlo

Todas las lecciones de Introducción a Luau

Practica por tu cuenta: Compilador de Luau online