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

Функции Lua

В Lua функция - это основной метод абстракции операторов и выражений. Она может использоваться для выполнения специальных задач и вычисления значений.

Lua предоставляет множество встроенных функций, которые можно легко вызывать в программе, например, функция print() может выводить传入ные параметры на экран.

Функции Lua主要有 двумя用途ми:

  • 1. Выполнить заданную задачу, в этом случае функция используется как оператор вызова;

  • 2. Вычислить и вернуть значение, в этом случае функция используется как выражение в операторе присваивания.

Определение функции

Формат определения функции в языке программирования Lua是这样的:

дополнительный_область_функции функция имя_функции( аргумент1, аргумент2, аргумент3..., аргументn)
    function_body
    return result_params_comma_separated
end

解析:

  • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local

  • function_name: 指定函数名称。

  • argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

  • function_body: 函数体,函数中需要执行的代码语句块。

  • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

  • 在线示例

    以下示例定义了函数 max(),参数为 num1, num2,用于比较两值的大小,并返回最大值:

    --[[ 函数返回两个值的最大值 --]]
    function max(num1, num2)
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
       return result; 
    end
    -- 调用函数
    print("两值比较最大值为 ",max(10,4))
    print("两值比较最大值为 ",max(5,6))

    Результат выполнения вышеуказанного кода составляет:

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

    Lua 中我们可以将函数作为参数传递给函数,如下示例:

    myprint = function(param)
       print("这是打印函数 -   ##",param,"##")
    end
    function add(num1,num2,functionPrint)
       result = num1 + num2
       -- 调用传递的函数参数
       functionPrint(result)
    end
    myprint(10)
    -- myprint 函数作为参数传递
    add(2,5,myprint)

    Результат выполнения вышеуказанного кода составляет:

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

    Множественные значения

    Функция Lua может возвращать несколько значений, например, string.find, которая возвращает строку соответствия "начало и конец индексов" (если не найдена соответствующая строка, возвращается nil).

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

    В функции Lua, после return можно перечислить список возвращаемых значений, чтобы вернуть несколько значений, например:

    function maximum (a)
        local mi = 1             -- индекс максимального значения
        local m = a[mi]          -- максимальное значение
        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

    Переменные параметры

    Функции Lua могут принимать переменное количество параметров, как и C, в списке параметров функции используется точка с запятой ... для обозначения того, что функция принимает переменное количество параметров.

    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

    Мы можем присвоить переменным параметрам переменную.

    Например, мы вычисляем среднее значение нескольких чисел:

    function average(...)
       result = 0
       local arg={...}    --> arg является таблицей, локальной переменной
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("Всего传入 " .. #arg .. " чисел")
       return result/#arg
    end
    print("Среднее значение", average(10,5,3,4,5,6))

    Результат выполнения вышеуказанного кода составляет:

    Всего传入 6 чисел
    Среднее значение составляет    5.5

    Мы также можем использовать select("#",...) для получения количества переменных параметров:

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("Всего传入 " .. select("#",...) .. " чисел")
       return result/select("#",...)
    end
    print("Среднее значение", 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, …) используется для возвращения m-го параметра списка. n м

    При вызове select необходимо передать фиксированный аргумент selector (переключатель) и множество переменных параметров. Если selector является числом n, then 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