PDA

Просмотр полной версии : [Урок] Статические локальные переменные в Lua



Daniel_Cortez
23.11.2014, 16:36
Думаю, многие слышали о статических локальных переменных в C или в Pawn: это такие переменные, которые доступны только внутри функции, в которой они объявлены, но сохраняют свои значения между разными вызовами функций.

Пример на языке C:


int CountCallTimes()
{
static int call_times = 0;
return ++call_times;
}

То же самое на языке Pawn:


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 (http://pro-pawn.ru/member.php?100-Daniel_Cortez)


Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

[ForD]
23.11.2014, 16:48
Давайте больше уроков по Lua касательно МТА :good2: