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
endObserva 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.
Desafío
FácilAsocia dos métodos a una cuenta con la sintaxis de dos puntos.
- Debajo de la tabla, define
function account:deposit(amount: number), que sumaamountaself.balance. - Define
function account:getBalance(): number, que devuelveself.balance. - Imprime
account:getBalance(), llama aaccount:deposit(120)y después vuelve a imprimiraccount: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
1Primeros pasos con Luau
¿Qué es Luau?¿Por qué usar Luau?Tu primer código en LuauComprobación de tipos y modos de errorRecapitulacion: Introducción a Luau4Trabajar con funciones
Tipado de parámetros y valores de retornoTipado de funciones anónimasFunciones que no devuelven nadaParámetros opcionalesValores predeterminados de parámetrosValores predeterminados para booleanosFunciones variádicasDefinir tipos de funcionesRepaso: funciones tipadas7Proyecto: Gestor de tareas tipado
Proyecto: La estructura de una tareaFunción para añadir una tarea2Tipos fundamentales
Número, cadena y booleanoEl tipo 'any': una salida de emergenciaEl tipo 'unknown'Tipos nulos y opcionalesLa inferencia de tipos en acciónAnotaciones de tipo explícitasRepaso: práctica de tipos fundamentales5Alias, Uniones e Intersecciones
Alias de tipos para primitivosTipos de uniónTrabajando con tipos de uniónTipos literalesTipos de intersecciónCombinando alias de tiposResumen: Combinaciones avanzadas de tipos3Tablas tipadas: arrays y mapas
Arrays tipadosAgregar y leer elementos¿Qué es un tipo mapa?Declarar y acceder a mapasRecorrer tablasTablas de formas mixtasLeer una cuadrículaConstruir una cuadrículatable.unpackRepaso: arrays y mapas6Definición de formas de tablas
Anotaciones de forma en líneaAlias de tipos para formasPropiedades opcionalesFormas frente a tablas no estructuradasExtensión de formasAñadir métodos a las formasEl parámetro 'self' y los métodos con dos puntosRecapitulación: Definición de formas de tablasPractica por tu cuenta: Compilador de Luau online