Раздел: 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)