Их всего восемь:
- nil — абсолютное ничего. Означает отсутствие данных. Иногда появление nil может быть чревато ошибками.
- boolean — логический тип данных. К нему относятся true (истина) и false (ложь). При выполнении логических операций false равнозначен nil.
- number — и так всё прекрасно понятно. Десятичный разделитель в Lua — точка. В остальном проблем не должно возникнуть.
- string — строка. Это отдельные параграф.
- function — функция. Также отдельный параграф.
- table — таблица. И снова отдельный параграф.
- userdata — пользовательские данные.
- thread — поток.
В lua нет строгой типизации, и поэтому не нужно задавать тип при создании или объявлении. Lua сам поймет какой тип применить к данному объекту.
3.1. Определение типов данных.
Принудительно этого делать не надо — Lua сам поймёт, что это за тип данных. Но иногда появляется необходимость понять, какой же тип данных использует та или иная переменная. Для этого придумали функцию type().
Пример:
a = 1; -- присваиваем переменной a тип данных number
print(type(a)) -- напечатается «number».
Все возможные строки, которые эта функция type возвращает: «nil», «number», «string», «boolean», «table», «function», «thread» и «userdata».
Если нужно, чтобы на выходе получалось число, а не какой-то тип:
if type(a) == 'number' then
end
так можно узнавать типы
print(nil) --печатает 'nil'
print(type(nil)) --печатает тип 'nil'
local n --переменная пустая nil, в нее пока ничего не записали
print(n) --печатает 'nil'
print(type(n)) --печатает тип 'nil'
local s= 'проверка'
print(s) --печатает 'проверка'
print(type(s)) --печатает тип 'string'
local flag = true
print(flag) --печатает 'true'
print(type(flag)) --печатает тип 'boolean'
local table = {} --так инициируют таблицу в спец скобках
print(table) --печатает 'table: 0xacf8c0'
print(type(table)) --печатает тип 'table'
3 2 тип integer or float
для того, чтобы определить является ли тип "number" integer или float есть такая такая функция math.type(value), которая работает только с числом. Иначе вернет nil.
3.3 игровые типы в варкрафте
в варкрафте некоторые игровые типы unit, effect, и др хэндлы являются userdata.
для определения типов варкрафта можете воспользоваться специальной функцией (благодарности Волчанке):
function extratype(ptr)
local typ = type(ptr)
if typ == "userdata" then
typ = string.match(tostring(ptr),"([^%%s]+):")
if typ == nil then
typ = string.match(tostring(ptr),"([^%%s]+)")
end
elseif typ == "number" then
if string.match(tostring(ptr),"([^%%s]+).") then return "real" else return "integer" end
end
return typ
end
или код Ласточки:
-- returns float/integer for values
-- returns wc3 type from tostring if it is userdata
-- else returns type(value)
function wc3type(value)
local mtyp = math.type(value)
if mtyp ~= nil then
return mtyp
end
local typ = type(value)
if typ == "userdata" then
local wc3type = string.match(tostring(value),"([^%%s]+):") --value:match("([^%%s]+)")
if not wc3type then
return typ
else
return wc3type
end
else
return typ
end
end
пример код
do
local InitGlobalsOrigin = InitGlobals
function InitGlobals()
InitGlobalsOrigin()
function extratype(ptr)
local typ = type(ptr)
if typ == "userdata" then
typ = string.match(tostring(ptr),"([^%%s]+):")
if typ == nil then
typ = string.match(tostring(ptr),"([^%%s]+)")
end
elseif typ == "number" then
if string.match(tostring(ptr),"([^%%s]+).") then return "real" else return "integer" end
end
return typ
end
TimerStart(CreateTimer(),0,false,function ()
local un = CreateUnit(Player(0),FourCC('hfoo'),0,0,0)
local g = CreateGroup ()
local num = 0
local float = 0.88
print(extratype(un)) --печатает unit
print(extratype(g)) --печатает group
print(extratype(num)) --печатает integer
print(extratype(float)) --печатает real (так называют тип float в варкрафте)
end)
end
end
заметка: В варкрафте приходится в специальной строке писать код с двойными %%:
string.match(tostring(ptr),"([^%%s]+).")
поскольку компилятор варкрафта ругается на знак %, нужно добавлять %%