English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Типы данных Lua

Lua является динамическим языком программирования, переменные не требуют типа определения, достаточно присвоить им значение. Значения могут храниться в переменных, передаваться в качестве параметров или возвращаться в качестве результатов.

В Lua есть 8 основных типов: nil, boolean, number, string, userdata, function, thread и table.

Тип данныхОписание
nilСамый простой, только значение nil относится к этому классу, что означает недействительное значение (в условиях выражения эквивалентно false).
booleanвключает два значения: false и true.
numberпредставляет собой двойную точность реального числа
stringСтроки представляются двойными или одинарными кавычками
functionфункции, написанные на C или Lua
userdata表示存储在变量中的C数据结构
thread表示独立执行的线路,用于执行协同程序
tableВ Lua таблица (table) является "ассоциативным массивом" (associative arrays), индексом массива может быть цифра, строка или таблица. В Lua, создание таблицы выполняется через "конструктивное выражение", simplest expression для создания пустой таблицы — это {}.

Мы можем использовать функцию type для тестирования типа переменной или значения:

print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string

nil (пусто)

Тип nil представляет собой тип без какого-либо действительного значения, у него только один значение -- nil, например, печать переменной, не имеющей значения, будет выводить значение nil:

> print(type(a))
nil
>

Для глобальных переменных и table nil также имеет "удаление" функцию, присвоение nil значению глобальной переменной или переменной в table равно удалению их, выполнение следующего кода покажет:

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end
 
tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

при сравнении nil следует добавить двойные кавычки ":

> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
>

результат type(X)==nil false причина этого в том, что type(X) по сути возвращает строку "nil", которая является типом string:

type(type(X))==string

boolean (булево)

Тип boolean имеет только два возможных значения: true (истина) и false (ложь), Lua рассматривает false и nil как false, все остальное как true, и число 0 также true:

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("по крайней мере один из них true")
else
    print("false и nil оба являются false")
end
if 0 then
    print("число 0 является true")
else
    print("число 0 является false")
end

Результат выполнения следующего кода будет следующим:

$ lua test.lua 
boolean
boolean
nil
false и nil оба являются false
число 0 является true

число (number)

Lua по умолчанию имеет только один тип числа -- тип double (двоеточие) (тип по умолчанию можно изменить в файле luaconf.h), следующие способы записи рассматриваются как тип числа:

print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

Результат выполнения следующего кода:

number
number
number
number
number
number

string (строка)

Строка представлена парой двойных или одинарных кавычек.

string1 = "this is string1"
string2 = 'this is string2'

Вы также можете использовать две квадратные скобки "[[]]", чтобы представить "блок" строки.

Онлайн пример

html = [[
<html>
<head></head>
<body>
    <a href="http://ru.oldtoolbag.com/">Базовый учебник</a>
</body>
</html>
]]
print(html)
Результат выполнения следующего кода:
<html>
<head></head>
<body>
    <a href="http://ru.oldtoolbag.com/">Базовый учебник</a>
</body>
</html>

Когда вы выполняете арифметические операции над строкой чисел, Lua пытается преобразовать эту строку чисел в число:

> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
>

В приведенном выше коде "error" + 1 вызовет ошибку, для соединения строк используется .. , например:

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
>

Использование # для вычисления длины строки, ставьте перед строкой, как в следующем примере:

> len = "ru.oldtoolbag.com"
> print(#len)
14
> print(#"ru.oldtoolbag.com")
14
>

table (таблица)

В Lua создание таблицы выполняется через "выражение конструктора", simplest expression is {}, which is used to create an empty table. You can also add some data to the table and initialize it directly:

-- создание пустой таблицы
local tbl1 = {}
 
-- прямое инициализирование таблицы
local tbl2 = {"apple", "pear", "orange", "grape"}

В Lua таблицы (table)其实是 "ассоциативные массивы" (associative arrays), индекс массива может быть как числовым, так и строковым.

-- файл скрипта table_test.lua
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

Результат выполнения скрипта:

$ lua table_test.lua 
key : value
10 : 33

В отличии от других языков программирования, в Lua таблицы имеют начальный индекс 1, а не 0.

-- файл скрипта table_test2.lua
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

Результат выполнения скрипта:

$ lua table_test2.lua 
Key    1
Key    2
Key    3
Key    4

Таблица не имеет фиксированной длины, при добавлении новых данных длина таблицы автоматически увеличивается, все начальные таблицы являются nil.

-- файл скрипта table_test3.lua
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

Результат выполнения скрипта:

$ lua table_test3.lua 
val
nil

функция (функция)

В Lua функция рассматривается как "первый класс значения (First-Class Value)". Функция может существовать в переменной:

-- файл скрипта function_test.lua
функция factorial1(n)
    if n == 0 then
        возврат 1
    else
        возврат n * факториал1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

Результат выполнения скрипта:

$ lua function_test.lua 
120
120

Функция может передаваться в виде анонимной функции (anonymous function) через параметр:

--function_test2.lua скрипт файла
function testFun(tab,fun)
        for k, v in pairs(tab) do
                print(fun(k,v));
        end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--анонимная функция
        return key.."="..val;
end
);

Результат выполнения скрипта:

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread (поток)

В Lua,最主要的 поток — это координата (coroutine). Она похожа на поток (thread), имеет свою собственную стэк, локальные переменные и указатель инструкций, может делиться глобальными переменными и большинством других вещей с другими координатами.

Разница между потоками и координатами: потоки могут выполняться одновременно, в то время как координаты могут выполняться только одну в момент времени, и координаты, находящиеся в состоянии выполнения, останавливаются только при их приостановке (suspend).

userdata (пользовательский тип)

userdata — это тип пользовательского данных, который используется для представления типа, созданного приложением или библиотекой языка C/C++, и позволяет хранить данные любого типа данных C/C++ (обычно struct и указатель) в переменной Lua для вызова.