• lua table面向对象扩展


    一 、table扩展

    -- 返回table大小
    table.size = function(t)
        local count = 0
        for _ in pairs(t) do
            count = count + 1
        end
        return count
    end
    
    -- 判断table是否为空
    table.empty = function(t)
        return not next(t)
    end
    
    -- 返回table键列表
    table.keys = function(hashtable)
        local keys = {}
        for k, v in pairs(hashtable) do
            keys[#keys + 1] = k
        end
        return keys
    end
    
    -- 返回table值列表
    table.values = function(t)
        local result = {}
        for k, v in pairs(t) do
            table.insert(result, v)
        end
        return result
    end
    
    -- 返回索引
    table.indexof = function(array, value, begin)
        for i = begin or 1, #array do
            if array[i] == value then return i end
        end
        return -1
    end
    
    table.equal = function (a, b)
        if type(a)~="table" or type(b)~="table" then
            return false
        end
        if #a ~= #b then
            return false
        end
        
        for k, v in pairs(a) do
            if b[k] == nil then
                return false
            end
            if type(a[k]) == "table" then
                if not table.equal(a[k], b[k]) then
                    return false
                end
            end
            if a[k] ~= b[k] then
                return false
            end
        end
        return true
    end
    
    -- 浅拷贝
    table.clone = function(t, nometa)
        local result = {}
        if not nometa then
            setmetatable(result, getmetatable(t))
        end
        for k, v in pairs (t) do
            result[k] = v
        end
        return result
    end
    
    -- 深拷贝
    table.copy = function(t, nometa)   
        local result = {}
    
        if not nometa then
            setmetatable(result, getmetatable(t))
        end
    
        for k, v in pairs(t) do
            if type(v) == "table" then
                result[k] = copy(v)
            else
                result[k] = v
            end
        end
        return result
    end
    
    table.merge = function(dest, src)
        for k, v in pairs(src) do
            dest[k] = v
        end
    end
    
    table.shuffle = function(t)
        if type(t)~="table" then
            return
        end
        local tab={}
        local index=1
        while #t~=0 do
            local n=math.random(0,#t)
            if t[n]~=nil then
                tab[index]=t[n]
                table.remove(t,n)
                index=index+1
            end
        end
        return tab
    end
    
    table.find  = function (tab, value)
        for k,v in ipairs(tab) do
            if v == value then
                return k
            end
        end
        return nil
    end

    二、面向对象扩展

    -- lua面向对象扩展
    function class(classname, super)
        local superType = type(super)
        local cls
    
        if superType ~= "function" and superType ~= "table" then
            superType = nil
            super = nil
        end
    
        if superType == "function" or (super and super.__ctype == 1) then
            -- inherited from native C++ Object
            cls = {}
    
            if superType == "table" then
                -- copy fields from super
                for k,v in pairs(super) do cls[k] = v end
                cls.__create = super.__create
                cls.super    = super
            else
                cls.__create = super
                cls.ctor = function() end
            end
    
            cls.__cname = classname
            cls.__ctype = 1
    
            function cls.new(...)
                local instance = cls.__create(...)
                -- copy fields from class to native object
                for k,v in pairs(cls) do instance[k] = v end
                instance.class = cls
                instance:ctor(...)
                return instance
            end
    
        else
            -- inherited from Lua Object
            if super then
                cls = {}
                setmetatable(cls, {__index = super})
                cls.super = super
            else
                cls = {ctor = function() end}
            end
    
            cls.__cname = classname
            cls.__ctype = 2 -- lua
            cls.__index = cls
    
            function cls.new(...)
                local instance = setmetatable({}, cls)
                instance.class = cls
                instance:ctor(...)
                return instance
            end
        end
    
        return cls
    end
    
    function iskindof(obj, classname)
        local t = type(obj)
        local mt
        if t == "table" then
            mt = getmetatable(obj)
        elseif t == "userdata" then
            mt = tolua.getpeer(obj)
        end
    
        while mt do
            if mt.__cname == classname then
                return true
            end
            mt = mt.super
        end
    
        return false
    end
  • 相关阅读:
    转载 linux 僵尸进程,讲的很透彻
    linux 程序自动运行总结
    使用__FILE__和__LINE__定位错误
    CURL简单使用
    阿里云域名绑定IP
    使用PHPEXCEL导入数据到数据库
    关于使用ueditor时候遇到的情况
    TP5使用PHPMAILER发送邮件
    使用ajax,结合jquery,php实现图片上传预览功能
    mysql关于数据量大的时候分页分批处理
  • 原文地址:https://www.cnblogs.com/unknown6248/p/13728785.html
Copyright © 2020-2023  润新知