MySQL- Руководство разработчика

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


Синтаксис для определения функций такой: function ::= function `(' [parlist1] `)' block end stat ::= function funcname `(' [parlist1] `)' block end funcname ::= name | name `.' name | name `:' name Инструкция function f () ... end является только синтаксическим аналогом для f = function () ... end а инструкция function v.f () ... end является синтаксическим аналогом для v.f = function () ... end

Функциональное определение представляет собой выполнимое выражение, чье значение имеет тип function. Когда Lua прекомпилирует chunk, все функциональные тела также прекомпилируются. Затем, всякий раз, когда Lua выполняет функциональное определение верхние переменные (upvalues) фиксируются, и функция выполняется. Этот функциональный образец (или замкнутое выражение) представляет собой конечное значение выражения. Различные образцы той же самой функции могут иметь различные верхние переменные.

Параметры действуют как локальные переменные, инициализированные со значениями параметра: parlist1 ::= `...' parlist1 ::= name {`,' name} [`,' `...'] Когда функция вызвана, список параметров будет откорректирован к длине списка параметров, если функция не vararg-функция, которая обозначена тремя точками (`...') в конце списка параметра. Функция vararg не корректирует список параметров, вместо этого она собирает все лишние параметры в неявный параметр, названный arg. Значением arg является таблицы из n полей, чьим значением является число параметров дополнительного пространства и сами эти параметры, перечисленные в полях 1, 2, ..., n.

Как пример, рассмотрите следующие определения: function f(a, b) end function g(a, b, ...) end function r() return 1,2,3 end Имеем следующее отображение параметров: ВЫЗОВ ПАРАМЕТРЫ

f(3) a=3, b=nil f(3, 4) a=3, b=4 f(3, 4, 5) a=3, b=4 f(r(), 10) a=1, b=10 f(r()) a=1, b=2 g(3) a=3, b=nil, arg={n=0} g(3, 4) a=3, b=4, arg={n=0} g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2} g(5, r()) a=5, b=1, arg={2, 3; n=2}

Результаты возвращены, используя инструкцию return. Если управление достигает конца функции без того, чтобы столкнуться с инструкцией return, то функция будет завершена без результатов.

Синтаксис funcname ::= name `:' name используется для определения методов, то есть функции, которые имеют неявный дополнительный параметр self .

Инструкция function v:f (...) ... end является только синтаксическим аналогом для v.f = function (self, ...) ... end

Обратите внимание, что функция получает дополнительный формальный параметр self.



Содержание раздела