WhiteEngine-专注图形渲染与游戏引擎技术的网站

新浪微薄腾讯微薄

最新碎语:暂无碎语

您的位置:WhiteEngine-专注图形渲染与游戏引擎技术的网站 >C#与Lua> Lua函数重载

Lua函数重载

local function create()
    local arg_table = {}
    local function dispatcher (...)
        local tbl = arg_table
        local n = select ("#",...)
        local last_match
        for i = 1,n do
            local t = type(select(i,...))
            local n = tbl[t]
            last_match = tbl["..."] or last_match
            if not n then
                return last_match (...)
            end
            tbl = n
        end
        return (tbl["__end"] or tbl["..."])(...)
    end
    local function register(desc,func)
        local tbl = arg_table
        for _,v in ipairs(desc) do
            if v=="..." then
                assert(not tbl["..."])
                tbl["..."] = func
                return
            end
 
            local n = tbl[v]
            if not n then
                n = {}
                tbl[v]=n
            end
            tbl = n
        end
        tbl["__end"] = func
    end
    return dispatcher, register, arg_table
end
 
local all={}
 
local function register(env,desc,name)
    local func = desc[#desc]
    assert(type(func)=="function")
    desc[#desc] = nil
 
    local func_table
    if all[env] then
        func_table = all[env]
    else
        func_table = {}
        all[env] = func_table
    end
 
    if env[name] then
        assert(func_table[name])
    else
        env[name],func_table[name] = create()
    end
 
    func_table[name](desc,func)
end
 
define = setmetatable({},{
    __index = function (t,k)
        local function reg (desc)
            register(getfenv(2),desc,k)
        end
        t[k] = reg
        return reg
    end
})


-- define.MyFun {
--     "number",
--     function(n)
--         print("number",n)
--     end
-- }
 
-- define.MyFun {
--     "string",
--     "number",
--     function(s,n)
--         print("string number",s,n)
--     end
-- }
 
-- define.MyFun {
--     "number",
--     "...",
--     function(n,...)
--         print("number ...",n,...)
--     end
-- }
 
define.MyFun {
    "...",
    function(...)
        print("default",...)
    end

}


    MyFun(1)  
    MyFun("hello",2)  
    MyFun("world")  
    MyFun(1,"hello")  
    MyFun("world","asdfasdfadsfdasf")
    MyFun("world","asdfdasfadsfdasfasd","asdfadsfasdfasdfawseewaf","asdfadsfasdgasdgasdg","asdfawfeewafaewfaewsd")
    MyFun(1,2,3,45,66457,13451324)      

---

转载请注明本文标题和链接:《Lua函数重载

分享到:

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交