Функции в Lua

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

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

Функции Lua в основном имеют два применения:

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

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

Формат определения функции в языке программирования Lua следующий:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    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("Это функция 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("www.example.com", "example") 
    > 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("example\n")       ---> fmt = "example", нет переменных аргументов.
    fwrite("%d%d\n", 1, 2)   ---> fmt = "%d%d", переменные аргументы — 1 и 2

    Вывод:

    example
    12
    

    Обычно при переборе переменных аргументов достаточно использовать только{…}, однако переменные аргументы могут содержать некоторыеnil, тогда можно использовать функциюselectдля доступа к переменным аргументам:select('#', …)илиselect(n, …)

    • select('#', …)Возвращает длину переменных аргументов.
    • select(n, …)Используется для возврата из начальной позицииnсписка всех аргументов от начальной до конечной позиции.

    При вызове select необходимо передать фиксированный фактический аргумент selector (переключатель selector) и серию переменных аргументов. Если selector — это число n, то select возвращает список аргументов от индексаnдо конечной позиции, все списки аргументов; в противном случае он может быть только строкой#, в этом случае select возвращает общее количество переменных аргументов.

    Пример

    функция f(...)
        a = select(3,...)  --> Начиная с третьей позиции, переменная a соответствует первому параметру в списке переменных справа
        print (a)
        print (select(3,...)) --> Вывести все параметры списка
    end

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

    Вывод:

    2
    2       3       4       5

    Пример

    do  
        function foo(...)  
            for i = 1, select('#', ...) do  --> Получить общее количество параметров
                local arg = select(i, ...); --> Прочитать параметры; arg соответствует первому параметру в списке переменных справа
                print("arg", arg);  
            end  
        end  
     
        foo(1, 2, 3, 4);  
    end

    Вывод:

    arg    1
    arg    2
    arg    3
    arg    4
    
    Другие расширения