Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    Статические локальные переменные в 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

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 23.11.2014 в 17:06. Причина: "void" returns "int"?! no way...
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 3 пользователя(ей) сказали cпасибо:
    Desulaid (16.06.2015) Disinterpreter (23.11.2014) [ForD] (23.11.2014)
  3. #2
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    688
    Репутация:
    103 ±
    Давайте больше уроков по Lua касательно МТА
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •