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)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!
Пример на языке 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)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!