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

Lua函数

En Lua, las funciones son el método principal para abstraer instrucciones y expresiones. Puede utilizarse para manejar ciertos trabajos o calcular ciertos valores.

Lua proporciona muchas funciones integradas, que puede llamar fácilmente en su programa, como la función print() que puede imprimir los parámetros introducidos en la consola.

Las funciones en Lua tienen dos usos principales:

  • 1.Completar una tarea específica, en este caso, la función se utiliza como una declaración de llamada;

  • 2.Calcular y devolver un valor, en este caso, la función se utiliza como expresión en una declaración de asignación.

Definición de función

El formato de definición de funciones en el lenguaje de programación Lua es el siguiente:

optional_function_scope función function_name( argumento1, argumento2, argumento3..., argumenton)
    function_body
    devolver result_params_comma_separated
end

Análisis:

  • optional_function_scope: Este parámetro es opcional para determinar si la función es una función global o local, si no se configura este parámetro, se considera una función global por defecto. Si necesita configurar la función como una función local, debe usar la palabra clave local.

  • function_name: Especificar el nombre de la función.

  • argumento1, argumento2, argumento3..., argumenton: Parámetros de la función, varios parámetros separados por comas, la función también puede no tener parámetros.

  • function_body: Cuerpo de la función, el bloque de instrucciones que se debe ejecutar en la función.

  • result_params_comma_separated: Valor devuelto por la función, en Lua, las funciones pueden devolver varios valores, separados por comas.

  • Ejemplo en línea

    A continuación se muestra un ejemplo de cómo definir una función: max(), parámetro para num1, num2,se utiliza para comparar dos valores y devolver el mayor:

    --[[La función devuelve el valor máximo de dos valores --]]
    función max(num1, num2)
       si (num1 > num2) entonces
          result = num1;
       else
          result = num2;
       end
       devolver result; 
    end
    -- llamar a la función
    imprimir("El valor máximo de dos comparaciones es ",max(10,4))}}
    imprimir("El valor máximo de dos comparaciones es ",max(5,6))}}

    以上代码执行结果为:

    El valor máximo de dos comparaciones es     10
    El valor máximo de dos comparaciones es     6

    En Lua, podemos pasar funciones como parámetros a otras funciones, como en el siguiente ejemplo:

    myprint = función(param)
       imprimir("Esto es una función de impresión -   ##",param,"##)
    end
    function add(num1,num2,functionPrint)
       result = num1 + num2
       -- Llamar a la función de parámetro pasada
       functionPrint(result)
    end
    myprint(10)
    -- myprint se pasa como parámetro
    add(2,5,myprint)

    以上代码执行结果为:

    Esta es la función de impresión -   ##    10    ##
    Esta es la función de impresión -   ##    7    ##

    Múltiples valores devueltos

    Las funciones Lua pueden devolver múltiples valores, por ejemplo string.find, que devuelve la secuencia de caracteres coincidente "inicio y final de la coincidencia" (si no hay secuencia de caracteres coincidente devuelve nil).

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

    En las funciones Lua, se puede listar la lista de valores a devolver después de return para devolver múltiples valores, como:

    function maximum (a)
        local mi = 1             -- Índice del máximo valor
        local m = a[mi]          -- Máximo valor
        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))

    以上代码执行结果为:

    23    3

    Parámetros variables

    Las funciones Lua pueden aceptar un número variable de argumentos, al igual que el lenguaje C, se utiliza tres puntos ...  en la lista de argumentos de la función para indicar que la función tiene argumentos variables.

    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   --> {...} representa un array compuesto por todos los parámetros variables  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))}}  --->25

    Podemos asignar parámetros variables a una variable.

    Por ejemplo, calculamos el promedio de varios números:

    function average(...)
       result = 0
       local arg={...}    --> arg es una tabla, variable local
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("El número total de valores ingresados es " .. #arg .. " cantidad")
       return result/#arg
    end
    print("El valor promedio es",average(10,5,3,4,5,6))}}

    以上代码执行结果为:

    总共传入 6 个数
    平均值为    5.5

    También podemos obtener el número de parámetros variables utilizando select("#",...):

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("El número total de valores ingresados es " .. select("#",...) .. " cantidad")
       return result/select("#",...)
    end
    print("El valor promedio es",average(10,5,3,4,5,6))}}

    以上代码执行结果为:

    总共传入 6 个数
    平均值为    5.5

    有时候我们可能需要几个固定参数加上可变参数,固定参数必须放在变长参数之前:

    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