Funciones son bloques de código que puedes ejecutar múltiples veces bajo demanda. También puedes conectarlas a eventos o asignarlas como callbacks.
Funciones básicas
Una definición de función incluye:
- El ámbito de la función (global o local).
- La palabra clave function.
- El nombre de la función en camelCase.
- Los parámetros de la función entre paréntesis (()).
- El bloque de código, o "cuerpo", de la función.
- La palabra clave end.
El cuerpo de la función se ejecuta cuando llamas a la función. Para llamar a una función, escribe su nombre seguido de paréntesis. Puedes definir una variable para aceptar el valor de retorno o usar el valor de retorno en lugar de una variable.
-- Esta función no tiene parámetros y devuelve nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Llamando a una función sin retorno
addOneAndTwo() -- 3
Parámetros
Los parámetros son variables que pones a disposición de la función y que solo se utilizan en el ámbito de la función. Las funciones no tienen parámetros por defecto. Si llamas a una función con más parámetros de los que espera, Luau ignora los parámetros adicionales. Si llamas a una función con menos parámetros de los que espera, Luau pasa nil para todos los parámetros que faltan.
-- Esta función tiene dos parámetros: num1 y num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- intento de realizar una operación aritmética (suma) en número y nil
Retorno
En el cuerpo de la función, la palabra clave return devuelve un resultado de un cálculo. Puedes devolver múltiples valores de una función. return termina la ejecución de la función y Luau espera que la palabra clave end siga a las declaraciones return, por lo que escribir código entre el comando return y el comando end genera un error.
-- Esta función devuelve un valor de retorno
local function addNumbers(num1, num2)
local result = num1 + num2
return result
end
print(addNumbers(1, 2)) -- 3
local seven = addNumbers(3, 4)
print(seven) -- 7
-- Esta función devuelve múltiples valores: suma y diferencia
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Llamando a una función y esperando múltiples valores de retorno
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Métodos
Los métodos son funciones que son miembros de un objeto, como una clase o tabla. Esperan el objeto mismo (self) como el primer argumento. Cuando llamas a un método, usa la notación de dos puntos (:) en lugar de la notación de punto (.) para pasar self como el primer argumento automáticamente.
Todos los objetos en Roblox descienden de Instance y tienen métodos de uso común, incluidos Instance:Destroy(), Instance:Clone() y Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")-- Destruyendo una parte con notación de punto (función)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- Destruyendo una parte con notación de dos puntos (método)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
Definir métodos
Para crear un método en una tabla, usa el nombre del método como la clave y la función del método como el valor. En la definición del método, el parámetro self se refiere a la tabla padre del método. Cuando llamas a un método usando la notación de dos puntos, pasas la tabla misma como el primer argumento. Puedes definir parámetros para un método, pero necesitas listarlos después del parámetro self.
En el siguiente ejemplo, la tabla testButton tiene un método como el valor de la clave changeEnabled. Puedes verificar que self se refiere a la tabla padre del método imprimiendo el valor de self.enabled.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- Llamar al método
testButton:changeEnabled(false) -- false
Callbacks
Los callbacks son funciones que se ejecutan en respuesta a otra función o proceso.
Callbacks básicos
Las funciones se pueden pasar a otras funciones, por ejemplo, una función anónima se puede usar para implementar un callback que table.sort() luego usa para ordenar una lista de Players de Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Usa un callback anónimo para ordenar los jugadores por nombre
return a.Name < b.Name
end)
En la API de Roblox, los callbacks se refieren a un miembro de función de solo escritura, los callbacks esperan hasta que devuelven. Los callbacks de uso común incluyen:
- MarketplaceService.ProcessReceipt, que maneja las compras de productos de desarrollador.
- BindableFunction.OnInvoke, que llama a la función cuando un script llama a BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke, que llama a la función cuando el servidor llama a RemoteFunction:FireClient(player, ...) o RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke, que llama a la función cuando un cliente llama a RemoteFunction:InvokeServer(...).
Para establecer un callback, asigna una función a él. Por ejemplo, BindableFunction.OnInvoke es un callback de BindableFunction. Puedes establecer una función nombrada o anónima a él, y puedes llamar (invocar) esa función llamando al método :Invoke() en el callback. Los argumentos que pasas a :Invoke() se envían al callback, y el valor de retorno de la función callback regresa al que llama a :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Técnicas de función
Manejadores de eventos
Puedes asignar una función, conocida como un manejador de eventos, para que se ejecute cuando se activa un evento. Por ejemplo, puedes crear una función llamada onPlayerAdded() para el evento Players.PlayerAdded para imprimir el nombre de cualquier jugador que se una. Para más información, consulta Eventos.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " se unió al juego!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Funciones anónimas
Puedes crear funciones sin nombres, conocidas como funciones anónimas, para usar como callbacks y manejadores de eventos. Al igual que las funciones nombradas, las funciones anónimas deben comenzar y terminar con las palabras clave function y end, pero no necesitas la palabra clave local para indicar el ámbito local porque siempre tienen un ámbito local.
En el siguiente ejemplo, el callback para la función task.delay() y el manejador de eventos para el evento Players.PlayerAdded son ambas funciones anónimas.
-- Función anónima en un callback para task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Función anónima en un manejador de eventos
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " se unió al juego!")
end)
Funciones en scripts de módulo
Puedes reutilizar funciones a través de múltiples scripts almacenándolas en ModuleScripts. Las funciones son un tipo de dato Luau, por lo que puedes almacenarlas en tablas junto con otros datos.
Funciones variádicas
Una función variádica acepta cualquier número de argumentos. Por ejemplo, Globals.LuaGlobals.print() es una función variádica.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("¡El %s es un %s!", "pastel", "mentira")) -- ¡El pastel es una mentira!print(string.char(115, 101, 99, 114, 101, 116)) -- secreto
Definir funciones variádicas
Para definir una función variádica, usas el token ... como el último o único parámetro (no confundir con .., el operador de concatenación). Puedes poner los valores ... en una tabla para facilitar su uso.
local function variadic(named, ...)
local arguments = {...} -- empaqueta los argumentos adicionales en una tabla
print("Argumento nombrado =", named)
for i, value in arguments do
print("Entrada No.", i, "=", value)
end
end
variadic(10, "Hola", 20, "Función Variádica")
--[[ Salida resultante:
Argumento nombrado = 10
Entrada No. 1 = Hola
Entrada No. 2 = 20
Entrada No. 3 = Función Variádica
]]
Reenviar argumentos
Puedes definir funciones variádicas como envolturas alrededor de otras funciones para pasar, o reenviar, argumentos desde la envoltura a las otras funciones.
local function printAround(functionToPrintAround, ...)
print("Antes")
functionToPrintAround(...)
print("Después")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Salida resultante:
Antes
x = 1
y + z = 5
Después
]]
Llamar a una función variádica con arreglos
Si deseas pasar una tabla de valores a una función variádica global, como print(), puedes usar la función global unpack() para pasar los valores de la tabla en lugar de la tabla misma.
local squares = {1, 4, 9, 16, 25}print("Los primeros 5 números cuadrados son:", unpack(squares))-- Los primeros 5 números cuadrados son 1 4 9 16 25