Руководство по Lua

Руководство по Lua

Статьи


Функции

Итак, мы выяснили, что функция является типом данных. То есть, функции можно возвращать из функций.
Пример:

function outer()
    function inner()
        return 1
    end
     return inner
end
local i  = outer() -- значение переменной i равно функции inner
local j = i() -- вызываем функцию i, значение переменной j равно 1

Функции могут принимать несколько значений. Если при вызове функции последние значения опущены, им присваивается nil. Параметры функции являются локальными переменными внутри функции.
Пример:

function f(x, y, z) -- определение функции
end

f() -- вызов функции. x, y, z равны nil
f(1) -- вызов функции. x = 1, y, z равны nil
f(1, 2) -- вызов функции. x = 1, y = 2, z равно nil
f(1, 2, 3) -- вызов функции. x = 1, y = 2, z = 3
f(1, 2, 3, 4) -- вызов функции. x = 1, y = 2, z = 3, 4 лишний параметр

Функции могут возвращать несколько значений.
Пример:

function f()
    return 1, 2, 3 -- функция возвращает три числа
end

local x, y, z = f() -- вызов функции. x = 1, y = 2, z = 3

Переменная _ используется в Lua для замены ненужной переменной.
Например, из функции f() нам нужно получить только третий параметр:

local _, _, z = f() -- z = 3


"Замороженные" переменные (upvalues)

Функция может обращаться к локальным переменным, которые определены вне ее. Если при вызове функции локальная переменная уже вышла из области видимости и была разрушена, то функция пользуется тем значением внешней локальной переменной (external local variable), которое было на момент определения функции.
Пример:

local x = 10 -- установили значение x
function f()
    return x + 1 -- на момент создания функции значение переменной x равно 10
end
x = 20 -- изменили x
local y = f() -- значение у равно 21, локальная переменная х продолжает существовать.

Изменим время жизни локальной переменной x:

do -- начало блока
    local x = 10 -- установили значение x
    function f()
        return x + 1 -- на момент создания функции значение переменной x равно 10
    end
end -- конец блока, переменной x больше нет
local y = f() -- значение у равно 11, хотя переменная х больше не существует

Функции, кстати, тоже могут быть локальными:

local f = function(x, y, z) -- да, функцию можно объявить и так, это ведь всего лишь один из типов данных.
    return z, y, x -- хе-хе, неплохая функция swap получилась, верно?
end


Некоторые особенности при вызове функций

Например, есть две функции:

function f1()
    return 1, 2
end

function f2(x, y)
    return x + y
end

Поскольку первая функция возвращает два значения, а вторая принимает два значения, то функции могут быть вызваны так:

loсal x = f2( f1() ) -- значение x равно 3

Задачка посложнее:

function f1()
    return 1, 2, 3
end

function f2(x, y, z)
    return x + y + z
end

local x = f2(f1()) -- x = 1 + 2 + 3

Теперь так:

local x = f2(4, f1()) -- x = 4 + 1 + 2

Понятно, что f1 дополняет последние параметры f2 нужным числом своих параметров. Однако это работает, только если вызов f1 стоит последним в списке параметров. Что будет если вызвать функции так:

local x = f2(f1(), 4, 5) -- x = 1 + 4 + 5

В этом случае из f1 будет взят только первый параметр. А если так:

local x = f2(f1(), 4) -- x = 1 + 4 + nil - ошибка!

Да, третьим параметром будет nil, что при выполнении математической операции сгенерирует ошибку.

Переменное число параметров

В Lua, как и в С, в функцию можно передавать переменное число параметров. Синтаксис также похож:

function f(x, y, ...)
end

Все параметры, скрытые за ... Lua упаковывает в локальную таблицу arg. У таблицы arg есть поле n, содержащее число переданных аргументов. Для примера, напечатаем все переданные в функцию аргументы:

function f(...)
    for i = 1, arg.n do
        print(arg[i])
    end
end
                      
f(1, 2, 3, "Вася") -- выведет соответственно 1, 2, 3, "Вася"

Работы в порту (грузчик и развозчик)
Работы в порту (грузчик и развозчик)
5-02-2021, 12:00, Скрипты
Смена производителя шин
Смена производителя шин
7-12-2020, 21:22, Скрипты
Cистема уровней
Cистема уровней
22-12-2020, 12:00, Скрипты
Телепорт-панель на DGS
Телепорт-панель на DGS
6-12-2020, 19:16, Скрипты
Movie
В данной публикации отсутствуют комментарии !

Перед публикацией, советую ознакомится с правилами!