Функции в 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 мы можем передавать функции в качестве аргументов другим функциям, как в следующем примере:
Пример
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, чтобы вернуть несколько значений, например:
Пример
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
Мы можем присвоить переменные аргументы переменной.
Например, давайте вычислим среднее нескольких чисел:
Пример
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("#",...) для получения количества переменных аргументов:
Пример
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
Иногда нам может понадобиться несколько фиксированных параметров плюс переменные аргументы. Фиксированные параметры должны располагаться перед переменными аргументами:
Пример
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 возвращает общее количество переменных аргументов.
Пример
a = select(3,...) --> Начиная с третьей позиции, переменная a соответствует первому параметру в списке переменных справа
print (a)
print (select(3,...)) --> Вывести все параметры списка
end
f(0,1,2,3,4,5)
Вывод:
2 2 3 4 5
Пример
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Другие расширения