Lua Funciones

En Lua, las funciones son el método principal para abstraer sentencias y expresiones. Se pueden usar tanto para manejar tareas especiales como para calcular valores.

Lua proporciona muchas funciones integradas que puedes llamar fácilmente en tus programas, como la función print(), que imprime los parámetros pasados en la consola.

Las funciones de Lua tienen principalmente dos usos:

  • 1. Realizar la tarea especificada; en este caso, la función se usa como una sentencia de llamada;
  • 2. Calcular y devolver valores; en este caso, la función se usa como expresión en una sentencia de asignación.

Definición de funciones

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

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

Explicación:

  • optional_function_scope:Este parámetro es opcional y especifica si la función es global o local. Si no se establece, por defecto es global. Si necesitas que la función sea local, debes usar la palabra clavelocal。

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

  • argument1, argument2, argument3..., argumentn: Parámetros de la función; varios parámetros se separan con comas. La función también puede prescindir de parámetros.

  • function_body: Cuerpo de la función; el bloque de sentencias de código que se ejecutará en la función.

  • result_params_comma_separated: Valor de retorno de la función; las funciones de Lua pueden devolver múltiples valores, cada valor separado por comas.

  • Ejemplo

    El siguiente ejemplo define la funciónmax(), con parámetros num1, num2, que se utiliza para comparar el tamaño de dos valores y devolver el valor máximo:

    Ejemplo

    --[[ La función devuelve el máximo de dos valores --]]
    function max(num1, num2)

       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end

       return result;
    end
    -- Llamar a la función
    print("el máximo de los dos valores es ",max(10,4))
    print("el máximo de los dos valores es ",max(5,6))

    El resultado de ejecutar el código anterior es:

    两值比较最大值为     10
    两值比较最大值为     6
    

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

    Ejemplo

    myprint = function(param)
       print("Esta es la función de impresión - ##",param,"##")
    end

    function add(num1,num2,functionPrint)
       result = num1 + num2
       -- Llamar al parámetro de función pasado
       functionPrint(result)
    end
    myprint(10)
    -- myprint función pasada como parámetro
    add(2,5,myprint)

    El resultado de ejecutar el código anterior es:

    这是打印函数 -   ##    10    ##
    这是打印函数 -   ##    7    ##
    

    Múltiples valores de retorno

    Las funciones de Lua pueden devolver múltiples valores de resultado, como string.find, que devuelve los índices de inicio y fin de la cadena coincidente (si no existe una coincidencia, devuelve nil).

    > s, e = string.find("www.example.com", "ejemplo") 
    > print(s, e)
    5    10
    

    En las funciones de Lua, puedes devolver múltiples valores simplemente listando los valores a retornar después de return, como:

    Ejemplo

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

    El resultado de ejecutar el código anterior es:

    23    3
    

    Parámetros variables

    Las funciones de Lua pueden aceptar un número variable de parámetros, similar al lenguaje C; en la lista de parámetros de la función se usan tres puntos... para indicar que la función tiene parámetros variables.

    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))  --->25

    Podemos asignar los parámetros variables a una variable.

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

    Ejemplo

    function average(...)
       result = 0
       local arg={...}    --> arg es una tabla, variable local
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("En total se pasan " .. #arg .. " números")
       return result/#arg
    end

    print("el promedio es",average(10,5,3,4,5,6))

    El resultado de ejecutar el código anterior es:

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

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

    Ejemplo

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("En total se pasan " .. select("#",...) .. " números")
       return result/select("#",...)
    end

    print("el promedio es",average(10,5,3,4,5,6))

    El resultado de ejecutar el código anterior es:

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

    A veces podemos necesitar algunos parámetros fijos además de los parámetros variables; los parámetros fijos deben colocarse antes de los parámetros variables:

    Ejemplo

    function fwrite(fmt, ...)  ---> parámetro fijo fmt
        return io.write(string.format(fmt, ...))    
    end

    fwrite("ejemplo\n")       --->fmt = "ejemplo", no hay parámetros variables.
    fwrite("%d%d\n", 1, 2)   --->fmt = "%d%d", los parámetros variables son 1 y 2

    El resultado de salida es:

    ejemplo
    12
    

    Normalmente, para iterar sobre los parámetros variables, solo se necesita usar{…}, sin embargo, los parámetros variables pueden contener algunosnil, entonces se puede usarselectla función para acceder a los parámetros variables:select('#', …)oselect(n, …)

    • select('#', …)Devuelve la longitud de los parámetros variables.
    • select(n, …)Se utiliza para devolver, desde el inicio,ntoda la lista de parámetros hasta la posición final.

    Al llamar a select, se debe pasar un argumento fijo selector (interruptor de selección) y una serie de parámetros variables. Si selector es el número n, entonces select devuelve, en la lista de parámetros, desde el índicenhasta la posición final, toda la lista de parámetros; de lo contrario, solo puede ser la cadena#, de esta manera select devuelve el número total de parámetros variables.

    Ejemplo

    function f(...)
        a = select(3,...)  --> A partir de la tercera posición, la variable a corresponde al primer parámetro de la lista de variables de la derecha
        print (a)
        print (select(3,...)) --> Imprimir todos los parámetros de la lista
    end

    f(0,1,2,3,4,5)

    El resultado de salida es:

    2
    2       3       4       5

    Ejemplo

    do  
        function foo(...)  
            for i = 1, select('#', ...) do  --> Obtener el total de parámetros
                local arg = select(i, ...); --> Leer el parámetro; arg corresponde al primer parámetro de la lista de variables de la derecha
                print("arg", arg);  
            end  
        end  
     
        foo(1, 2, 3, 4);  
    end

    El resultado de salida es:

    arg    1
    arg    2
    arg    3
    arg    4
    
    Otras extensiones