Добавлен , опубликован

Lua для чайников

Содержание:
Их всего восемь:
  1. nil — абсолютное ничего. Означает отсутствие данных. Иногда появление nil может быть чревато ошибками.
  2. boolean — логический тип данных. К нему относятся true (истина) и false (ложь). При выполнении логических операций false равнозначен nil.
  3. number — и так всё прекрасно понятно. Десятичный разделитель в Lua — точка. В остальном проблем не должно возникнуть.
  4. string — строка. Это отдельные параграф.
  5. function — функция. Также отдельный параграф.
  6. table — таблица. И снова отдельный параграф.
  7. userdata — пользовательские данные.
  8. 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]+).")
поскольку компилятор варкрафта ругается на знак %, нужно добавлять %%

`
ОЖИДАНИЕ РЕКЛАМЫ...