zoukankan      html  css  js  c++  java
  • 关于lua包nil截断的问题

    local unpack = unpack or table.unpack
    
    -- 解决原生pack的nil截断问题,SafePack与SafeUnpack要成对使用
    function SafePack(...)
        local params = {...}
        params.n = select('#', ...)
        return params
    end
    
    -- 解决原生unpack的nil截断问题,SafePack与SafeUnpack要成对使用
    function SafeUnpack(safe_pack_tb)
        return unpack(safe_pack_tb, 1, safe_pack_tb.n)
    end
    
    -- 对两个SafePack的表执行连接
    function ConcatSafePack(safe_pack_l, safe_pack_r)
        local concat = {}
        for i = 1,safe_pack_l.n do
            concat[i] = safe_pack_l[i]
        end
        for i = 1,safe_pack_r.n do
            concat[safe_pack_l.n + i] = safe_pack_r[i]
        end
        concat.n = safe_pack_l.n + safe_pack_r.n
        return concat
    end
    
    -- 闭包绑定
    function Bind(self, func, ...)
        assert(self == nil or type(self) == "table")
        assert(func ~= nil and type(func) == "function")
        local params = nil
        if self == nil then
            params = SafePack(...)
        else
            params = SafePack(self, ...)
        end
        return function(...)
            local args = ConcatSafePack(params, SafePack(...))
            func(SafeUnpack(args))
        end
    end
    
    -- 回调绑定
    -- 重载形式:
    -- 1、成员函数、私有函数绑定:BindCallback(obj, callback, ...)
    -- 2、闭包绑定:BindCallback(callback, ...)
    function BindCallback(...)
        local bindFunc = nil
        local params = SafePack(...)
        assert(params.n >= 1, "BindCallback : error params count!")
        if type(params[1]) == "table" and type(params[2]) == "function" then
            bindFunc = Bind(...)
        elseif type(params[1]) == "function" then
            bindFunc = Bind(nil, ...)
        else
            error("BindCallback : error params list!")
        end
        return bindFunc
    end
  • 相关阅读:
    2017北京网络赛 J Pangu and Stones 区间DP(石子归并)
    2017北京网络赛 F Secret Poems 蛇形回路输出
    2017 北京网络赛 E Cats and Fish
    CF 1198 A. MP3 模拟+滑动窗口
    博弈论
    gym 101911
    容器STL
    POJ 3281 Dining 最大流+拆点
    hdu 1533 Going Home 最小费用最大流 (模板题)
    C#博文搜集
  • 原文地址:https://www.cnblogs.com/chenggg/p/13921550.html
Copyright © 2011-2022 走看看