lua 自实现pairs

1.实现一个简单的pairs

local tbl = {}
function GenerateData()
    --构造一个哈希 table
    for i = 1,10 do
        local value = math_random(1,100000)
        tbl[value] = value
    end
end

--自己实现的pairs
function selfPairs(tbl,key)
    -- assert(tbl == "table")
    --迭代器函数
    local function iterator(tbl,key)
        return next(tbl,key)
    end
    --这里的tbl 会作为 迭代器的第一个参数, nil会作为迭代器的第二个参数  以此类推
    return iterator,tbl,nil
end

GenerateData()
for k,v in selfPairs(tbl) do
    printx(k,v)
end


--自己实现的pairs 返回一个数组table
function selfPairs2(tbl,key)
    assert(type(tbl) == "table")
    local newTbl = {}
    for _,v in pairs(tbl) do
        table.insert(newTbl,v)
    end
    table.sort(newTbl,function(a,b)
        return a > b
    end)

    --迭代器函数
    local function iterator(tbl,key)
        return next(tbl,key)
    end
     --这里的newTbl 会作为 迭代器的第一个参数, nil会作为迭代器的第二个参数  以此类推
    return iterator,newTbl,nil
end

GenerateData()

for k,v in selfPairs2(tbl) do
    printx(k,v)
end

2.实现对象的pairs

--自己的双向链表类
clsSelfDLinkObj = STRUCT.clsDLink:Inherit("clsSelfDLinkObj")

--复写pairs
function clsSelfDLinkObj:pairs()
    local function iterator(self,node)
        --把条件运算符当成三元运算符使用,可能造成死循环
        
        --注意:下面这么写肯定会死循环 因为当遍历到链表的尾节点时, Next为nil, 此时 node 又等于 self.m_Header 陷入死循环
        --[[
            node = node and node.Next or self.m_Header
            if node and node.Data then
			    return node, node.Data
		    end
        ]]
        
        --修正 只要没有环存在,就不会陷入死循环
        if not node then
			node = self.m_Header
		else
			node = node.Next
		end
        
        return node,node and node.Data
    end
    --这里的self 会作为 迭代器的第一个参数, nil会作为迭代器的第二个参数  以此类推
    return iterator,self,nil
end



local TEST_COUNT = 5
function TestDLink()
    local SelfDLinkObj = clsSelfDLinkObj:New()
    clsSelfDLinkObj:OnCreate("EXREA_TEST")
    for i= 1,TEST_COUNT do
        SelfDLinkObj:Push(i)
    end

    for Node,Data in SelfDLinkObj:pairs() do
        printx(Node,Data)
    end
end
TestDLink()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值