English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua函数

In Lua, le funzioni sono il principale metodo di astrazione di istruzioni e espressioni. Possono essere utilizzate per eseguire compiti speciali o calcolare valori.

Lua fornisce molte funzioni predefinite, che puoi chiamare facilmente nel tuo programma, come la funzione print() che stampa i parametri passati sullo schermo di controllo.

Le funzioni Lua hanno principalmente due utilizzi:

  • 1. Completare il compito specificato, in questo caso la funzione viene utilizzata come istruzione di chiamata;

  • 2. Calcolare e restituire un valore, in questo caso la funzione viene utilizzata come espressione di una istruzione di assegnamento.

Definizione della funzione

Il formato di definizione della funzione del linguaggio di programmazione Lua è il seguente:

opzionale_ambito_di_funzione funzione nome_funzione( argomento1, argomento2, argomento3..., argomenton)
    function_body
    return result_params_comma_separated
end

Analisi:

  • optional_function_scope: Questo parametro è opzionale per determinare se la funzione è una funzione globale o locale, se non è impostato il parametro, viene considerato come funzione globale per impostazione predefinita, se si desidera impostare la funzione come funzione locale, è necessario utilizzare la parola chiave local

  • function_name: Specificare il nome della funzione.

  • argument1, argument2, argument3..., argumentn: Parametro della funzione, più parametri sono separati da virgola, la funzione può anche non avere parametri.

  • function_body: Corpo della funzione, il blocco di istruzioni da eseguire nella funzione.

  • result_params_comma_separated: Valore di ritorno della funzione, le funzioni del linguaggio Lua possono restituire più valori, ciascun valore è separato da una virgola.

  • Esempio online

    Esempio di definizione della funzione max()Parametro num1, num2, utilizzato per confrontare due valori e restituire il valore massimo:

    --[[ La funzione restituisce il valore massimo di due valori --]]
    funzione max(num1, num2)
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
       return result; 
    end
    -- Chiamata della funzione
    print("Confronto di due valori, il valore massimo è ",max(10,4))
    print("Confronto di due valori, il valore massimo è ",max(5,6))

    Il risultato dell'esecuzione del codice sopra è:

    Confronto di due valori, il valore massimo è     10
    Confronto di due valori, il valore massimo è     6

    In Lua possiamo passare una funzione come parametro a un'altra funzione, come nell'esempio seguente:

    myprint = funzione(param)
       print("Questa è la funzione di stampa -   ##",param,"##")
    end
    funzione add(num1,num2,functionPrint)
       result = num1 + num2
       -- Chiamata del parametro funzione trasmesso
       functionPrint(result)
    end
    myprint(10)
    -- myprint funzione come parametro trasmesso
    add(2,5,myprint)

    Il risultato dell'esecuzione del codice sopra è:

    Questa è la funzione di stampa -   ##    10    ##
    Questa è la funzione di stampa -   ##    7    ##

    Valori di ritorno multipli

    La funzione Lua può restituire più valori di ritorno, ad esempio string.find, che restituisce la stringa di corrispondenza "inizio e fine degli indici" (se non esiste una stringa di corrispondenza restituisce nil).

    > s, e = string.find("it.oldtoolbag.com", "w3codebox") 
    > print(s, e)
    5 10

    Nelle funzioni Lua, possiamo elencare la lista dei valori da restituire dopo il return per restituire più valori, come ad esempio:

    function maximum(a)
        local mi = 1 -- indice del valore massimo
        local m = a[mi] -- valore massimo
        for i, val in ipairs(a) do
           if val > m then
               mi = i
               m = val
           end
        end
        return m, mi
    end
    print(maximum({8, 10, 23, 12, 5}))

    Il risultato dell'esecuzione del codice sopra è:

    23 3

    Parametri variabili

    Le funzioni Lua possono accettare un numero variabile di parametri, come nel linguaggio C, usando tre punti ... nella lista dei parametri della funzione per indicare che la funzione accetta parametri variabili.

    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do --> {...} rappresenta un array composto da tutti i parametri variabili  
        s = s + v  
      end  
      return s  
    end  
    print(add(3, 4, 5, 6, 7)) --> 25

    Possiamo assegnare i parametri variabili a una variabile.

    Ad esempio, possiamo calcolare la media di alcuni numeri:

    function average(...)
       result = 0
       local arg={...} --> arg è una tabella, variabile locale
       for i, v in ipairs(arg) do
          result = result + v
       end
       print("Sono stati passati in totale " .. #arg .. " numeri")
       return result/#arg
    end
    print("Il valore medio è", average(10, 5, 3, 4, 5, 6))

    Il risultato dell'esecuzione del codice sopra è:

    Sono stati passati in totale 6 numeri
    Il valore medio è 5.5

    Possiamo anche utilizzare select("#",...) per ottenere il numero di parametri variabili:

    function average(...)
       result = 0
       local arg={...}
       for i, v in ipairs(arg) do
          result = result + v
       end
       print("Sono stati passati in totale " .. select("#",...) .. " numeri")
       return result/select("#",...)
    end
    print("Il valore medio è", average(10, 5, 3, 4, 5, 6))

    Il risultato dell'esecuzione del codice sopra è:

    Sono stati passati in totale 6 numeri
    Il valore medio è 5.5

    A volte potremmo aver bisogno di alcuni parametri fissi più parametri variabili, i parametri fissi devono essere messi prima dei parametri variabili:

    function fwrite(fmt, ...) ---> 固定的参数fmt
        return io.write(string.format(fmt, ...))     
    end
    fwrite("w3codebox\n")       --->fmt = "w3codebox", 没有变长参数。  
    fwrite("%d%d\n", 1, 2)   --->fmt = "%d%d", 变长参数为 1 和 2

    输出结果为:

    w3codebox
    12
  • 通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select('#', …) 或者 select(n, …)

    • select('#', …) 返回可变参数的长度。

    • select(n, …) 用于返回参数列表中的第 n 个参数。

    调用 select 时,必须传入一个固定实参 selector(选择开关) 和一系列变长参数。如果 selector 为数字 n,那么 select 返回参数列表中的第 n 个参数,否则只能为字符串 #,这样 select 返回变长参数的总数。

    示例代码:

    do  
        function foo(...)  
            for i = 1, select('#', ...) do  -->获取参数总数
                local arg = select(i, ...); -->读取参数
                print("arg", arg);  
            end  
        end  
      
        foo(1, 2, 3, 4);  
    end

    输出结果为:

    arg    1
    arg    2
    arg    3
    arg    4