Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Алгоритм
Версия Warcraft:
1.31+
Хочу поделиться функцией для проверки типа переменной.
Пример:
local test = Player(0)
IsType(test, 'string') -- -> false
IsType(test, 'player') -- -> true
IsType(test, {'player'}) -- -> true
IsType(test, {'unit', 'player'}) -- -> true
IsType(test, {'unit', 'string'}) -- -> false
-- Change it to false for disabling
local enabled = true

---@param var_type any
---@param need_type string[]
---@return boolean
local function forList(var_type, need_type)
    for i = 1, #need_type do
        if var_type == need_type[i] then
            return true
        end
    end
    return false
end

---@param var any
---@return string
local function getWcType(var)
    local wc3_type_string = tostring(var)
    local pos = wc3_type_string:find(':')
    return wc3_type_string:sub(1, pos - 1)
end

---@param var any
---@param need_type string | string[]
---@return boolean
function IsType(var, need_type)
    if not enabled then
        return true
    end

    local err = false
    local is_list = false

    if type(need_type) == 'table' then
        is_list = true
        for i = 1, #need_type do
            if type(need_type[i]) ~= 'string' then
                err = true
                break
            end
        end
    elseif type(need_type) ~= 'string' then
        err = true
    end

    if err then
        error('isType: need_type must be string or string[] type.', 2)
    end

    local var_type = type(var)
    if var_type == 'userdata' then
        var_type = getWcType(var)    
    end

    if is_list then
        return forList(var_type, need_type)
    else
        return var_type == need_type
    end
end
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
17
3 года назад
Отредактирован GetLocalPlayer
0
ага, сломаем все либы сразу
Что подразумевает, что ты уже используешь какие-то либы переопределяющие/дополняющие поведение стандартных функций. Это уже не моя головная боль, а твоя, на твоей совести.
2
13
3 года назад
Отредактирован Nelloy
2
Оригинал функции был предназначен для работы с моими классами ООП с проверками наследования. В таком духе:
---@type ColorClass
local Color = ...

function public:setColor(color)
    isTypeErr(color, Color, 'color')
    ...
end

NazarPunk, очень рад, если Вы гений-кодер и никогда не ошибаетесь. Мне, увы, этого не дано и приходится везде делать проверки, чтобы не искать потом ошибки принтами.
0
29
3 года назад
0
Nelloy, зачем в рантайме проверки типа переменной делать? Если хочется строгих проверок типов, то typescript в помощь. Там и ООП есть)
0
37
3 года назад
0
Какой-то бигбрейн код, честно говоря, в луа утиная типизация и работаем с ней в этом формате
0
13
3 года назад
0
NazarPunk, с typescript не знаком, но выглядит интересно.
2
29
3 года назад
2
с typescript не знаком, но выглядит интересно.
Там основная идея отлавливать ошибки в compile-time, а не гадать, что же лежит в переменной.
1
1
3 года назад
1
Грац!
Очень помог!
0
13
3 года назад
0
NazarPunk, подразобрался, это прямо то, чего не хватало! Спасибо
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.