Раздел: CronosPRO | Дата редакции: 11.07.2013 | id статьи: 1541 |
Определение функций в Lua
Типичное определение функции выглядит следующим образом:
function f(x,y)
return x*y -- тело функции
end
Как видно из этого примера, определение функции состоит из следующих элементов:
- ключевого слова function;
- имени (f в данном примере);
- заключённого в круглые скобки списка аргументов функции (возможно, пустого);
- тела функции, размещённого между закрывающей скобкой и ключевым словом end.
Приведённое выше определение функции является просто более удобным способом записи следующего выражения:
f = function (x,y) return x*y -- тело функции end
Таким образом, определение функции фактически выполняет два действия:
- Создаёт объект типа «функция» (это делает выражение function (x,y) ... end).
- Помещает ссылку на созданную функцию в переменную или поле таблицы (в нашем примере — в переменную f).
Обратите внимание
- Имя f принадлежит переменной, в которую помещена ссылка на функцию, но не самой функции. Любые функции
в Lua анонимны, то есть не имеют имён. Когда говорят об имени функции, например, «функция f», на самом
деле подразумевают переменную f, содержащую ссылку на эту функцию. У переменных, содержащих ссылки на функции,
нет жёсткой привязки к самим функциям; работа с такими переменными осуществляется точно так же, как и с любыми
другими переменными.
function f(x,y) return x*y end -- создаем функцию, переменная f содержит ссылку на эту функцию MsgBox(f(2,3))--> 6 s = f -- переменная s ссылается на ту же функцию, что и f MsgBox(s(2,3))--> 6 t = {} t.sqr = f -- поле sqr таблицы t ссылается на ту же функцию, что и f MsgBox((t.sqr(2,3))--> 6 f = MsgBox -- f теперь "превратилась" в функцию MsgBox f("Привет, мир!") --> "Привет, мир!"
Несмотря на то, что обычно ссылка на созданную функцию присваивается переменной, такое присваивание не является
обязательным. В приведённом ниже примере создаётся безымянная функция, которая сразу передаётся в качестве параметра
в функцию table.sort:
table.sort (t, function (a, b) return (a > b) end)