Введение в Lua


Особенности Lua


Жизнь была бы действительно хороша, если бы типы данных lua и C/C++ совпадали. Но если бы это было так, то мы закончили бы теми же проблемами, которые мы имеем с C/C++ (Распределение памяти, вопросы контроля соответствия типов и т.д. и Вам пришлось бы это всё использовать). Чтобы упростить жизнь, lua разработана как язык с динамическим контролем типов. Если точнее, lua вообще не имеет никаких типов переменных. Нет никакого int, float, char или подобного объявления переменной. Сверхъестественная вещь, даже при том, что мы только что сказали, что нет никаких типов в lua, все значения таких переменных могут быть использованы.

Что Вы сказали?

По порядку. Говоря 'динамический тип' мы подразумеваем то, что переменная не имеет никакого определенного типа, но имеет значение.

ЧЕГО, ЧЕГО?

Это может показаться немного сложным, если Вы не занимались COM программированием или не заглядывали под капот Visual Basic. Если Вы всё-таки имели такой опыт, то это всего лишь обзор для Вас; иначе, мы погружаемся в сказочную страну универсальных [variant] типов данных.
Variant по существу 'содержит все' типы данных. По определению, любая переменная, созданная как вариантная, имеет любой тип данных … пауза … не поверите, но у этого есть смысл … наверное. Попробуем. Скажем, есть новое определение типа (в символическом виде):

typedef struct _variant { int type; union

{ int Integer; double Float; char String[255]; } } Variant;

Что мы здесь имеем - новый тип названный variant. Основываясь на значении поля type, мы могли бы использовать Integer, Float или String поля для взятия данных. Каждая переменная, которую мы создаем основана на Variant и может содержать любые данные, но какие именно зависит от ее значения. Это очень просто. И это эффективно, Вы вскоре сами увидите. Пожалуйста обратите внимание, что lua не использует такой вид структуры, поскольку это внутренний тип данных и намного сложнее чем представлено здесь. Это была просто иллюстрация.

Так, все, что понимает lua - это вариантный тип данных.
Данные, которые он может содержать в этом вариантном типе: nil, число, строка, функция, userdata и table. Так из этого видно, что переменная в lua может быть числовой, символьной или функцией. Остальные два, userdata и table, я объясню позднее.

Итак, если мы можем поместить данные в этот вариантный тип в числовом или символьном виде, то надеемся, что есть и какой-то способ извлечь их на стороне C++. Есть несколько функций, для конвертирования и управления этими данными. Некоторые из них:

double lua_tonumber (lua_State *L, int index); const char* lua_tostring (lua_State *L, int index); size_t lua_strlen (lua_State *L, int index); lua_CFunction lua_tocfunction (lua_State *L, int index); void* lua_touserdata (lua_State *L, int index);
Функций для обращения к параметрам переданным через lua гораздо больше. Так, что они делают? Ну, поскольку они читают данные им приходится преобразовывать их из одного формата lua к чему-либо в C++. На кой нужен нам индексный [index] элемент? Что, если мы хотим передать несколько параметров? Само собой, это возможно. Так, как мы обработаем это? Ответ: lua стек.

Страницы: 1 2 3 4 5 Следующая страница Автор: Ash Matheson
Перевод: Alexandr Fedotovskih Комментарии: 13
Версия для печати


Содержание раздела