Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство по Lua.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
451.58 Кб
Скачать

4.4.5.8 Вызовы функций

Вызовы функций в Lua имеют синтаксис:

functioncall ::= varorfunc args

Сначала вычисляется varorfunc. Если значение имеет тип function, то эта функция будет вызвана с данными параметрами. Иначе вызывается метод function тэга, имея первым параметром значение varorfunc с перечисленными затем первоначальными параметрами обращения. Подробности в разделе 4.4.8.

Форма

functioncall ::= varorfunc `:' name args

Может использоваться, чтобы вызвать methods. Обращение v:name(...) синтаксически аналогично v.name(v, ...), за исключением того, что v будет оценен только однажды. Параметры имеют следующий синтаксис:

args ::= `(' [explist1] `)'

args ::= tableconstructor

args ::= literal

explist1 ::= {exp1 `,'} exp

Все выражения параметра оценены перед обращением. Обращение в форме f{...} синтаксически аналогично f({...}), то есть список параметров представляет собой одиночную новую таблицу. Обращение в форме f'...' (f"..." или f[[...]]) синтаксически аналогично f('...'), то есть список параметров представляет собой одиночную строку литералов.

Потому, что функция может возвращать любое число результатов, число результатов должно быть откорректировано прежде, чем они используются. Если функция вызвана как инструкция, то список возврата откорректирован к 0, таким образом отбрасывая все возвращенные значения. Если функция вызвана в месте, которое нуждается в одиночном значении (синтаксически обозначенном нетерминальным exp1), то список возврата откорректирован к 1, таким образом отбрасывая все возвращенные значения, но не первый. Если функция вызвана в месте, которое может использовать много значений (синтаксически обозначено нетерминальным exp), то никакая корректировка не будет сделана. Единственные места, которые могут обрабатывать много значений, это последние (или единственные) выражения в присваивании, в списке параметров или в инструкции return. Имеются примеры:

f() -- 0 результатов

g(f(), x) -- f() 1 результат

g(x, f()) -- g получает x и все значения, возвращенные f()

a,b,c = f(), x -- f() скорректирован к 1 результату (и c получает nil)

a,b,c = x, f() -- f() 2 результата

a,b,c = f() -- f() 3 результата

return f() -- возвращает все значения, возвращенные f()

return x,y,f() -- вернет a, b и все, что вернет f()

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

Синтаксис для определения функций такой:

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]