Итак, мы выяснили, что функция является типом данных. То есть, функции можно возвращать из функций.
Пример:
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
Функция может обращаться к локальным переменным, которые определены вне ее. Если при вызове функции локальная переменная уже вышла из области видимости и была разрушена, то функция пользуется тем значением внешней локальной переменной (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, "Вася"
Перед публикацией, советую ознакомится с правилами!
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter