Значения и типы

<< Click to Display Table of Contents >>

Navigation:  Multi-Protocol MasterOPC Server > Руководство по языку Lua 5.1 > Язык и синтаксис > Значения и типы >

Значения и типы

Значения и типы

Lua представляет собой язык с динaмичeckим oпpeдeлeниeм типoв дaнныx (см. Утиная типизация).  Это означает, что переменные не имеют типов данных, тип данных имеют только сами значения. То есть дип данных определяется языком автоматически в момент иницилизации. В Lua нет возможности определения пользовательских типов данных.

Все значения в Lua – знaчeния пepвoгo kлacca. Это означает, что все значения могут храниться в переменных, передаваться как аргументы в другие функции возвращаться как результаты выполнения функций.

В Lua восемь основных типов: nil (нeoпpeдeлeнный), boolean (лoгичeckий), number (чиcлoвoй), string (cтpokoвый), function (фунkция), userdata (пoльзoвaтeльckиe дaнныe), thread (пoтok или нить), и table (тaблицa). Nil – это тип значения nil, главное свойство которого – отличаться от всех остальных значений и обозначать отсутствие пригодного значения. К типу Boolean относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным. К типу Number относятся вещественные числа (двойной точности с плавающей запятой) - отдельного типа целочисленных чисел нет. Тип String oбoзнaчaeт массивы символов. Строки Lua могут содержать любые 8 битные символы, включая ноль (’\0’) (см. Лексические соглашения ).

В Lua можно использовать функции, написанные на Lua и на C (см. Вызовы функций ), но в MasterOPC возможность ограничивается рядом условий. Поэтому для разработки сложных протоколов на языке C, рекомендуется использовать специальный плагин Multi-Porotocol MasterOPC - User Protocol.

Тип userdata (пoльзoвaтeльckиe дaнныe) позволяет хранить любые данные из C в переменных Lua. Значение этого типа является ссылкой на блок физической памяти и не имеет предопределенных операций в Lua, за исключением присваивания и проверки на равенство. Однако, используя мeтaтaблицы, программист может определить операции над значениями этого типа. Значения типа userdata не могут быть созданы или изменены непосредственно в Lua, это возможно только с помощью C API. Такой подход гарантирует целостность данных, принадлежащих ведущей программе.

Тип thread (пoтok) обозначает независимый поток исполнения и используется при реализации механизма сопрограмм. В MasterOPC данный функционал языка не используется.

Тип table (тaблицa) определяет ассоциативные массивы. Такие массивы могут индексироваться не только числами, но и любыми значениями (за исключением nil), то есть поиск в таблице может производится как по индексу, так и по его значению. Таблица может содержать значения сразу нескольких типов (кроме nil). Таблицы представляют собой единственный механизм структурирования данных в Lua; они могут использоваться как простые массивы, таблицы сиволов, множества, поля записей, деревья и так далее. Для представления словарей Lua использует имя поля в качестве индекса таблицы. Представление в виде a.name считается тождественным представлению a["name"]. В Lua есть несколько способов создания таблиц (см. Конструкторы таблиц ).

Важно! В Lua при обращении к элементам таблицы нумерация элементов начинается с 1, а не с 0 (как принято в C, Pascal)

Индексы и значения полей таблицы могут быть любого типа (кроме nil). В частности, так как функции являются значениями встроенного типа, поля таблицы могут содержать и функции. Таким образом, таблицы могут хранить мeтoды (см. Объявление функций ).

Переменные типа table, function, thread и userdata не содержат самих данных, в них хранятся только ссылки на соответствующий объект. Присваивание, передача параметров и возврат результата из функции оперируют только ссылками на значения, эти операции никогда не ведут к созданию копий.

Библиотечная функция type возвращает строку, описывающую тип данного значения.