Статические локальные переменные в Lua
Думаю, многие слышали о статических локальных переменных в C или в Pawn: это такие переменные, которые доступны только внутри функции, в которой они объявлены, но сохраняют свои значения между разными вызовами функций.
Пример на языке C:
PHP код:
int CountCallTimes()
{
static int call_times = 0;
return ++call_times;
}
То же самое на языке Pawn:
PHP код:
CountCallTimes()
{
static call_times = 0;
return ++call_times;
}
Данная функция вернёт количество своих вызовов: в первый раз она вернёт 1, во второй - 2, и т.д.
В Lua нет поддержки статических переменных. Тем не менее, есть возможность симитировать похожее поведение.
Для начала напишем заготовку для функции:
Код:
function countCallTimes()
end
Обратите внимание: название функции начинается с маленькой буквы (стиль lowerCamelCase): именно в таком стиле принято задавать имена функций в Lua.
Теперь создадим переменную-счётчик, значение которой будет возвращать функция:
Код:
local call_times = 0
function countCallTimes()
call_times = call_times+1
return call_times
end
Вы скажете: "какая же это локальная переменная, если она будет доступна для других функций?"
Эту проблему можно исправить. Заключим всю функцию с переменной в локальный блок do..end:
Код:
do
local call_times = 0
function countCallTimes()
call_times = call_times+1
return call_times
end
end
Итак, теперь функция countCallTimes объявлена в глобальном пространстве имён (таблица _G), а переменная call_times видна только для функции countCallTimes (вернее, только внутри локального блока do..end).
Ещё один нюанс: если Вы хотите, чтобы функция countCallTimes была доступна только внутри файла, в котором она была объявлена, следует объявить её, как локальную.
Код:
do
local call_times = 0
local function countCallTimes()
call_times = call_times+1
return call_times
end
end
Но не спешите радоваться: функция будет доступна только внутри блока do..end и её нельзя будет нигде использовать.
Исправим этот недочёт: вынесем объявление переменной под функцию за пределы блока do..end, а её реализацию оставим внутри блока.
Код:
local countCallTimes
do
local call_times = 0
countCallTimes = function()
call_times = call_times+1
return call_times
end
end
Автор урока: Daniel_Cortez
Копирование данной статьи на других ресурсах без разрешения автора запрещено!