Раздел: CronosPRO Дата редакции: 10.07.2013 id статьи: 1513

Типы данных Lua

Какие типы данных поддерживает язык Lua?

Lua поддерживает следующие типы данных:
  • Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.
  • Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).

    При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.

  • Number (числовой). Служит для представления числовых значений.

    В числовых константах можно указывать необязательную дробную часть и необязательный десятичный порядок, задаваемый символами «e» или «E». Целочисленные числовые константы можно задавать в шестнадцатеричной системе, используя префикс 0x.

    Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

  • String (строковый). Служит для представления строк.

    Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:

    a = "это строка"
    b = 'это вторая строка'

    Строки, заключённые в двойные кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа «\» (обратный слэш):

    • \b (пробел),
    • \n (перевод строки),
    • \r (возврат каретки);
    • \t (горизонтальная табуляция),
    • \\ (обратный слеш);
    • \'' (двойная кавычка);
    • \' (одинарная кавычка).

    Обратите внимание

    • Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:

      \ddd,

      где ddd — последовательность из не более чем трёх цифр.

    Кроме кавычек для определения строки могут также использоваться двойные квадратные скобки:
    local a = [[Компания "Кронос"]]
    Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:
    local a = [[string
    string1
    string2
       string3
    ]] -- "string
           string1
           string2
              string3"

    Примечание

    • При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса.
    Двойные скобки могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется символ «равно» (=):
    local a = [=[определение строки [[string]] в Lua]=] 
       -- будет срока: "определение строки [[string]] в Lua"
  • Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции и возвращены как результат выполнения функций.

  • Table (таблица). Таблица представляет собой набор пар «ключ» — «значение», которые называют полями или элементами таблицы. Как ключи, так и значения полей таблицы могут иметь любой тип, за исключением nil. Таблицы не имеют фиксированного размера: в любой момент времени в них можно добавить произвольное число элементов.

    Подробнее — в статье «Создание таблиц в Lua» (id: 1531).

  • Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.

    Userdata используется для представления новых типов, созданных в вызывающей скрипт программе или в библиотеках, написанных на языке С. Например, библиотеки расширений Lua для «CronosPRO» используют этот тип для представления таких объектов, как:

    • банки данных (класс Bank);
    • базы данных (класс Base);
    • записи (класс Record) и т. п.

  • Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.

Как в Lua задать тип переменной?

Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).
a = 123 -- переменная a имеет тип number
a = "123" -- теперь переменная a имеет тип string
a = true -- теперь переменная a имеет тип boolean
a = {} -- теперь переменная a имеет тип table

Обратите внимание

  • Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.
  • a = {} -- создаем таблицу. В переменную a помещается ссылка на таблицу
    b = a -- переменная b ссылается на ту же таблицу, что и a
    a[1] = 10 -- элементу таблицы с индексом 1 присвоено значение 10
    MsgBox(b[1]) --> '10'
    b[1] = 20 
    MsgBox(a[1]) --> '20'
  • Остальные данные являются непосредственными значениями.
  • a = 10
    b = a
    a = 20
    MsgBox(a) --> '20'
    MsgBox(b) --> '10'

Как в Lua получить тип переменной?

Тип значения, сохранённого в переменной, можно выяснить при помощи стандартной функции type. Эта функция возвращает строку, содержащую название типа («nil», «number», «string», «boolean», «table», «function», «thread», «userdata»).
t = type ("это строка") -- t равно "string"
t = type (123) -- t равно "number"
t = type (type) -- t равно "function"
t = type (true) -- t равно "boolean"
t = type (nil) -- t равно "nil"
t = type (CroApp.GetBank()) -- t равно "userdata"

Как в Lua преобразовать тип переменной?

Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку.
a = "10" + 2 -- a равно 12
a = "10" + 2 -- a равно "10 + 2"
a = "-5.3e-10"*"2" -- a равно -1.06e-09
a = "строка" + 2 -- Ошибка! Невозможно преобразовать "строка" в число
Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.
a = tostring (10) -- a равно "10"
a = tostring (true) -- a равно "true"
a = tostring (nil) -- a равно "nil"
a = tostring ({[1] = "это поле 1"}) -- a равно "table: 06DB1058"
Из предыдущего примера видно, что содержимое таблиц функцией tostring не преобразуется. Выполнить такое преобразование можно с помощью функции render.
a = render (10) -- a равно "10"
a = render (true) -- a равно "true"
a = render (nil) -- a равно "nil"
a = render ({[1] = "это поле 1"}) -- a равно "{[1] = "это поле 1"}"
Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.
a = tonumber ("10") -- a равно "10"
a = tonumber ("10"..".5") -- a равно 10.5
a = tonumber (true) -- a равно "nil"
a = tonumber (nil) -- a равно "nil"