曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3343|回复: 0
打印 上一主题 下一主题

遍历 table 的方法/泛型 for

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2014-12-8 02:09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
遍历 table,实际上就是遍历 table 中的键值对(key-value pair) 。

对于一个数组型的 table,使用一个普通的 for 来遍历,比如:
  1. Squares = {}

  2. for I = 1, 5 do
  3.         Squares[I] = I ^ 2
  4. end

  5. for I = 1, #Squares do
  6.         print(I .. " Squares is " .. Squares[I])       
  7. end
复制代码

运行输出:
1 Squares is 1
2 Squares is 4
3 Squares is 9
4 Squares is 16
5 Squares is 25


还有更好的方法,使用 ipairs 方法来遍历:
  1. Squares = {}

  2. for I = 1, 5 do
  3.         Squares[I] = I ^ 2
  4. end

  5. for I, Squares in ipairs(Squares) do
  6.         print(I .. " Squares is " .. Squares)       
  7. end
复制代码

使用 ipairs方法,也用到 for,每一次迭代,都会分别将 table 中的 key 和 value 分别赋给 I 和 Squares 这两个变量。

实际上,for 中使用 ipairs 这种用法,此时 for 称之为泛型 for (generic for),其形式为:
for <var-list> in <exp-list> do
          <body>
end

其中,<var-list> 是一个或多个变量名的列表,以逗号分隔;<exp-list> 是一个或多个表达式列表,同样用逗号分隔。

需要注意的是,在使用 ipairs 去遍历数组时,如果该数组存在空隙(存在 nil 元素),那么遍历行为会在遇到第一个空隙(nil) 时停止,比如:
  1. for Number, Word in ipairs({"one", "two", nil, "four"}) do
  2.         print (Number, Word)
  3. end
复制代码

输出结果为:
1        one
2        two


ipairs 正如前面的字符 i 所暗示的,它用来遍历数组(数字为下标)。如果要用来遍历非数组的 table ,那么使用 pairs ,如下所示:
  1. NameToInstr = { John = "班长", Pual = "组长", George = "学习委员",}

  2. for Name, Instr in pairs(NameToInstr) do
  3.         print (Name .. " 职位 " .. Instr)
  4. end
复制代码

运行输出:
Pual 职位 组长
John 职位 班长
George 职位 学习委员

上面代码中,每一次迭代,key 被赋给 Name;value 被赋给 Instr 。注意,输出结果不是按照顺序的!

循环中的变量也可以作为 upvalue ,考察下面代码:
  1. Numbers = {"one", "two", "three"}

  2. PrependNumber = {}

  3. for Num, NumName in ipairs(Numbers) do
  4.        
  5.         PrependNumber[Num] = function (Str)
  6.                 return NumName .. ": " .. Str
  7.         end
  8. end

  9. print (PrependNumber[2]("is company"))

  10. print (PrependNumber[3]("is a crowd"))
复制代码

运行输出:
two: is company
three: is a crowd

每一次迭代意味着都会有一个新的 upvalue (这里指的是迭代变量 NumName),而且一个新的函数也会被创建出来,并被放在 PrependNumber 这个 table 里(索引是数字)。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 02:54 , Processed in 0.059745 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表