Las funciones son bloques de código que puedes ejecutar múltiples veces con un comando.También puedes conectarlos a eventos o asignarlos como llamadas de devolución.
Funciones básicas
Una definición de función incluye:
- El alcance 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 una función, escriba su nombre seguido de paréntesis.Puedes definir una variable para aceptar el valor de devolución o usar el valor de devolución 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
-- Llamar a una función sin un devolver
addOneAndTwo() -- 3
Pará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 scope.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 por todos los parámetros perdidos.
-- 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) -- attempt to perform arithmetic (add) on number and nil
Regresar
En el cuerpo de la función, la palabra clave return devuelve un resultado de una operación.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 las declaraciones return , por lo que escribir código entre la comando return y la comando end lanza un error.
-- Esta función devuelve un valor de devolución
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
-- Llamar una función y esperar múltiples valores de devolución
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 una tabla.Esperan el propio objeto ( self ) como primer argumento.Cuando llame a un método, use la notación de colon ( : ) 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, incluidos Instance:Destroy(), Instance:Clone() y Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")-- Destruir una parte con notación de punto (función)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- Espacio de trabajofirstPart.Destroy(firstPart)print(firstPart.Parent) -- ninguno-- Destruir una parte con notación de colon (método)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- Espacio de trabajosecondPart:Destroy()print(secondPart.Parent) -- nil
Definir métodos
Para crear un método en una tabla, utilice el nombre del método como clave y la función del método como 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 colon, pasas la tabla misma como primer argumento.Puedes definir parámetros para un método, pero debes enumerarlos después del parámetro self.
En el siguiente ejemplo, la tabla testButton tiene un método como valor de la clave changeEnabled.Puedes verificar que self se refiere a la tabla padre del método al imprimir el valor de self.enabled .
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- cierto
-- Llamar al método
testButton:changeEnabled(false) -- false
Devoluciones de llamada
Las llamadas de devolución son funciones que se ejecutan en respuesta a otra función o proceso.
Llamadas básicas
Las funciones se pueden pasar a otras funciones, por ejemplo, una función anónima se puede usar para implementar una llamada de devolución que luego usa para ordenar una lista de de .
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Usa una llamada anónima para ordenar a los jugadores por nombre
return a.Name < b.Name
end)
En la API de Roblox, las llamadas de devolución de llamada se refieren a un miembrosde función solo de lectura, las llamadas de devolución de llamada se devuelven hasta que devolver. Las llamadas de devolución de llamada ampliamente utilizadas incluyen:
- MarketplaceService.ProcessReceipt , que maneja las compras de productos de desarrolladores.
- BindableFunction.OnInvoke , que invoca la función cuando un script llama BindableFunction:Invoke(...) .
- RemoteFunction.OnClientInvoke , que llama a la función cuando el servidor llama RemoteFunction:FireClient(player, ...) o RemoteFunction:FireAllClients(...) .
- RemoteFunction.OnServerInvoke , que invoca la función cuando un cliente llama RemoteFunction:InvokeServer(...) .
Para establecer una llamada de devolución, asigna una función a ella.Por ejemplo, BindableFunction.OnInvoke es una llamada de devolución de BindableFunction .Puedes establecer una función llamada o anónima a ella, y puedes llamar ( invocar ) esa función llamando el método en la llamada de devolución.Los argumentos que pasas a :Invoke() hacia adelante al llamado de devolución, y el valor de devolución de la función de llamada devuelve al llamador de :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 gestor de eventos , para ejecutarse cuando se activa un evento.Por ejemplo, puedes crear una función llamada onPlayerAdded() al evento Players.PlayerAdded para imprimir el nombre de cualquier jugador que se una.Para obtener más información, vea Eventos.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Funciones anónimas
Puedes crear funciones sin nombres, conocidas como funciones anónimas , para usar como llamadas de devolución y manejadores de eventos.Al igual que las funciones con nombre, 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, la función de devolución de llamadas 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 una llamada de devolución de tarea a task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Función anónima en un manipulador de eventos
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game!")
end)
Funciones en scripts de módulo
Puedes reutilizar funciones en múltiples scripts almacenándolas en ModuleScripts.Las funciones son un introducirde dato Luau, por lo que puedes almacenarlas en tablas con otros datos.
Funciones variativas
Una función variada acepta cualquier número de argumentos. Por ejemplo, Globals.LuaGlobals.print() es una función variada.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- ¡El pastel es una mentira!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
Define funciones variativas
Para definir una función variada, usa 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 el uso.
local function variadic(named, ...)
local arguments = {...} -- empaqueta los argumentos adicionales en una tabla
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ Resultado de Salida:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]
Argumentos de adelante
Puedes definir funciones variativas como envoltorios alrededor de otras funciones para paseo enviar argumentos desde el envoltorio a las otras funciones.
local function printAround(functionToPrintAround, ...)
print("Before")
functionToPrintAround(...)
print("After")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Resultado de Salida:
Before
x = 1
y + z = 5
After
]]
Llamar una función variada con arrays
Si quieres pasar un array de valores de una tabla a una función variada global, como print(), puedes usar la función global unpack() para pasar los valores de la tabla en lugar de la propia tabla.
local squares = {1, 4, 9, 16, 25}print("The first 5 square numbers are:", unpack(squares))-- The first 5 square numbers are 1 4 9 16 25