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:
- 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 un retorno
addOneAndTwo() -- 3Parámetros
Los parámetros son variables que pones a disposición de la función y solo se utilizan en el alcance 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 faltantes.
-- 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 aritmética (suma) en número y nilRetorno
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 finaliza 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) -- -1Métodos
Los métodos son funciones que son miembros de un objeto, como una clase o tabla. Esperan el objeto en sí (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 comúnmente utilizados, incluyendo 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 = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- Destruyendo una parte con notación de dos puntos (método)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart:Destroy()
print(secondPart.Parent) -- nilDefinir 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 en sí 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
-- Llama al método
testButton:changeEnabled(false) -- falseCallbacks
Los callbacks son funciones que se ejecutan en respuesta a otra función o proceso.
Callbacks básicos
Las funciones pueden ser pasadas a otras funciones, por ejemplo, una función anónima puede ser utilizada 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 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 ampliamente utilizados 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 llamador de :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84Té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 alcance local porque siempre tienen alcance 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 a 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 en múltiples scripts almacenándolas en ModuleScripts. Las funciones son un tipo de dato de Luau, por lo que puedes almacenarlas en tablas 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 = 4
print(string.format("¡El %s es un %s!", "pastel", "mentira")) -- ¡El pastel es una mentira!
print(string.char(115, 101, 99, 114, 101, 116)) -- secretoDefinir 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 de ... 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
]]Pasar argumentos
Puedes definir funciones variádicas como envolturas alrededor de otras funciones para pasar, o reenviar, argumentos de 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 un arreglo de 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