Funzioni sono blocchi di codice che puoi eseguire più volte su comando. Puoi anche collegarle a eventi o assegnarle come callback.
Funzioni di base
Una definizione di funzione include:
- La portata della funzione (globale o locale).
- La parola chiave function.
- Il nome della funzione in camelCase.
- I parametri della funzione tra parentesi (()).
- Il blocco di codice, o "corpo", della funzione.
- La parola chiave end.
Il corpo della funzione viene eseguito quando chiami la funzione. Per chiamare una funzione, digita il suo nome seguito dalle parentesi. Puoi definire una variabile per accettare il valore di ritorno o usare il valore di ritorno al posto di una variabile.
-- Questa funzione non ha parametri e restituisce nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Chiamare una funzione senza un ritorno
addOneAndTwo() -- 3
Parametri
I parametri sono variabili che rendi disponibili alla funzione e vengono utilizzati solo nell'ambito della funzione. Le funzioni non hanno parametri per impostazione predefinita. Se chiami una funzione con più parametri di quanti ne prevede, Luau ignora i parametri extra. Se chiami una funzione con meno parametri di quanti ne prevede, Luau passerà nil per tutti i parametri mancanti.
-- Questa funzione ha due parametri: num1 e num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- tentativo di eseguire un'operazione aritmetica (add) su numero e nil
Ritorno
Nel corpo della funzione, la parola chiave return restituisce un risultato da una computazione. Puoi restituire più valori da una funzione. return termina l'esecuzione della funzione e Luau si aspetta che la parola chiave end segua le dichiarazioni di return, quindi scrivere codice tra il comando return e il comando end genera un errore.
-- Questa funzione restituisce un valore di ritorno
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
-- Questa funzione restituisce più valori: somma e differenza
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Chiamare una funzione e aspettarsi più valori di ritorno
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Metodi
I metodi sono funzioni che sono membri di un oggetto, come una classe o un tabella. Si aspettano l'oggetto stesso (self) come primo argomento. Quando chiami un metodo, usa la notazione dei due punti (:) invece della notazione a punto (.) per passare automaticamente self come primo argomento.
Tutti gli oggetti in Roblox discendono da Instance e hanno metodi comunemente usati come Instance:Destroy(), Instance:Clone() e Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")-- Distruggere una parte con notazione a punto (funzione)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- Distruggere una parte con notazione a due punti (metodo)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
Definire metodi
Per creare un metodo in una tabella, usa il nome del metodo come chiave e la funzione del metodo come valore. Nella definizione del metodo, il parametro self si riferisce alla tabella genitore del metodo. Quando chiami un metodo utilizzando la notazione a due punti, passi la tabella stessa come primo argomento. Puoi definire parametri per un metodo, ma devi elencarli dopo il parametro self.
Nell'esempio seguente, la tabella testButton ha un metodo come valore della chiave changeEnabled. Puoi verificare che self si riferisca alla tabella genitore del metodo stampando il valore di self.enabled.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- Chiama il metodo
testButton:changeEnabled(false) -- false
Callback
Le callback sono funzioni che vengono eseguite in risposta a un'altra funzione o processo.
Callback di base
Le funzioni possono essere passate in altre funzioni, ad esempio, una funzione anonima può essere utilizzata per implementare una callback che table.sort() utilizza poi per ordinare un elenco di Players da Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Usa una callback anonima per ordinare i giocatori per nome
return a.Name < b.Name
end)
Nell'API di Roblox, le callback si riferiscono a una funzione membro di sola scrittura, le callback attendono fino a quando non restituiscono. Le callback ampiamente utilizzate includono:
- MarketplaceService.ProcessReceipt, che gestisce gli acquisti di prodotti per sviluppatori.
- BindableFunction.OnInvoke, che chiama la funzione quando uno script chiama BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke, che chiama la funzione quando il server chiama RemoteFunction:FireClient(player, ...) o RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke, che chiama la funzione quando un client chiama RemoteFunction:InvokeServer(...).
Per impostare una callback, assegna una funzione ad essa. Ad esempio, BindableFunction.OnInvoke è una callback di BindableFunction. Puoi impostare una funzione nominata o anonima ad essa, e puoi chiamare (invocare) quella funzione chiamando il metodo :Invoke() sulla callback. Gli argomenti che passi a :Invoke() vengono inoltrati alla callback, e il valore di ritorno dalla funzione callback restituisce a chi ha chiamato :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Tecniche delle funzioni
Gestori di eventi
Puoi assegnare una funzione, nota come gestore di eventi, da eseguire quando un evento si attiva. Ad esempio, puoi creare una funzione chiamata onPlayerAdded() per l'evento Players.PlayerAdded per stampare il nome di qualsiasi giocatore si unisca. Per ulteriori informazioni, vedere Eventi.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " è entrato nel gioco!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Funzioni anonime
Puoi creare funzioni senza nomi, note come funzioni anonime, da utilizzare come callback e gestori di eventi. Come le funzioni nominate, le funzioni anonime devono iniziare e terminare con le parole chiave function e end, ma non è necessario utilizzare la parola chiave local per indicare un ambito locale poiché hanno sempre un ambito locale.
Nell'esempio seguente, la callback per la funzione task.delay() e il gestore di eventi per l'evento Players.PlayerAdded sono entrambe funzioni anonime.
-- Funzione anonima in una callback a task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Funzione anonima in un gestore di eventi
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " è entrato nel gioco!")
end)
Funzioni nei moduli script
Puoi riutilizzare funzioni in più script memorizzandole in ModuleScripts. Le funzioni sono un tipo di dato Luau, quindi puoi memorizzarle in tabelle con altri dati.
Funzioni variadiche
Una funzione variadica accetta un numero qualsiasi di argomenti. Ad esempio, Globals.LuaGlobals.print() è una funzione variadica.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("Il %s è una %s!", "torta", "bugia")) -- La torta è una bugia!print(string.char(115, 101, 99, 114, 101, 116)) -- segreto
Definire funzioni variadiche
Per definire una funzione variadica, utilizzi il token ... come ultimo parametro o unico (non confondere con .., l'operatore di concatenazione). Puoi mettere i valori ... in una tabella per facilità d'uso.
local function variadic(named, ...)
local arguments = {...} -- impacchettare gli argomenti extra in una tabella
print("Argomento nominato =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Ciao", 20, "Funzione Variadica")
--[[ Risultato in output:
Argomento nominato = 10
Input No. 1 = Ciao
Input No. 2 = 20
Input No. 3 = Funzione Variadica
]]
Inoltrare argomenti
Puoi definire funzioni variadiche come wrapper attorno ad altre funzioni per passare, o inoltrare, argomenti dal wrapper alle altre funzioni.
local function printAround(functionToPrintAround, ...)
print("Prima")
functionToPrintAround(...)
print("Dopo")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Risultato in output:
Prima
x = 1
y + z = 5
Dopo
]]
Chiamare una funzione variadica con array
Se desideri passare un array di valori a una funzione variadica globale, come print(), puoi utilizzare la funzione globale unpack() per passare i valori della tabella invece della tabella stessa.
local squares = {1, 4, 9, 16, 25}print("I primi 5 numeri quadrati sono:", unpack(squares))-- I primi 5 numeri quadrati sono 1 4 9 16 25