浅谈lua泛型for

在lua中我们要遍历一个tb,有序数组用ipairs,无序的则会用pairs(借助闭包性质来实现)

直接先上代码

---------------------------------
--数组型
---------------------------------
local tb1 = {3,2,1}
for i,v in ipairs(tb1) do
  print(i,v)
end

-----------------------------------
--字典型
-----------------------------------
local tb2 = {x=1,y=2,z=3}
for k,v in pairs(tb2) do
  print(k,v)
end

 

泛型for比较复杂,它在循环过程内保存了迭代器函数。它实际上保存着3个值:一个迭代器函数、一个恒定状态和一个控制变量。接下来,分别进行总结。
泛型for的语法如下:

for <var-list> in <exp-list> do
     <body>
end

下面是一个展开后的例子:

for k, v in pairs(t) do print(k, v) end

-- 就等价于以下代码:
for var_1, ..., var_n in <explist> do <block> end
do
     local _f, _s, _var = <explist>    -- 返回迭代器函数、恒定状态和控制变量的初值
     while true do
          local var_1, ..., var_n = _f(_s, _var)
          _var = var_1
          if _var == nil then break end
          <block>
          end
     end
end

 

明白上面的代码后那么ipairs和pairs是怎么实现的呢,我们就能自己来写一个了

---------------------------------
--数组型迭代器
---------------------------------

local tb1 = {3,2,1}

function iter(tb,i)
  i = i + 1
  if nil == tb[i] then
    return nil,nil
  else
    return i,tb[i]
  end
end

function ipairs(tb)
  return iter,tb,0
end

for i,v in ipairs(tb1) do
  print(i,v)
end

-----------------------------------
--字典型迭代器
-----------------------------------
local tb2 = {x=1,y=2,z=3}

function pairs(tb)
  return next,tb,nil
end

for k,v in pairs(tb2) do
  print(k,v)
end

 

扩展内容:LUA中函数变长参数的使用(利用了变长参数来构造一个TB然后通过迭代器来进行累加)

function getSum(...)
    local res = 0
    for i,v in ipairs{...} do
         res =  res + v
    end
    return res
end

local res = getSum(1,2,3,4,5,6,7,8,9,10)
print(res)--输出为55

 

posted @ 2016-02-15 11:19  Jensen抹茶喵  阅读(495)  评论(0编辑  收藏  举报