|
遍历 table,实际上就是遍历 table 中的键值对(key-value pair) 。
对于一个数组型的 table,使用一个普通的 for 来遍历,比如:
- Squares = {}
- for I = 1, 5 do
- Squares[I] = I ^ 2
- end
- for I = 1, #Squares do
- print(I .. " Squares is " .. Squares[I])
- end
复制代码
运行输出:
1 Squares is 1
2 Squares is 4
3 Squares is 9
4 Squares is 16
5 Squares is 25
还有更好的方法,使用 ipairs 方法来遍历:
- Squares = {}
- for I = 1, 5 do
- Squares[I] = I ^ 2
- end
- for I, Squares in ipairs(Squares) do
- print(I .. " Squares is " .. Squares)
- 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) 时停止,比如:
- for Number, Word in ipairs({"one", "two", nil, "four"}) do
- print (Number, Word)
- end
复制代码
输出结果为:
ipairs 正如前面的字符 i 所暗示的,它用来遍历数组(数字为下标)。如果要用来遍历非数组的 table ,那么使用 pairs ,如下所示:
- NameToInstr = { John = "班长", Pual = "组长", George = "学习委员",}
- for Name, Instr in pairs(NameToInstr) do
- print (Name .. " 职位 " .. Instr)
- end
复制代码
运行输出:
Pual 职位 组长
John 职位 班长
George 职位 学习委员
上面代码中,每一次迭代,key 被赋给 Name;value 被赋给 Instr 。注意,输出结果不是按照顺序的!
循环中的变量也可以作为 upvalue ,考察下面代码:
- Numbers = {"one", "two", "three"}
- PrependNumber = {}
- for Num, NumName in ipairs(Numbers) do
-
- PrependNumber[Num] = function (Str)
- return NumName .. ": " .. Str
- end
- end
- print (PrependNumber[2]("is company"))
- print (PrependNumber[3]("is a crowd"))
复制代码
运行输出:
two: is company
three: is a crowd
每一次迭代意味着都会有一个新的 upvalue (这里指的是迭代变量 NumName),而且一个新的函数也会被创建出来,并被放在 PrependNumber 这个 table 里(索引是数字)。
|
|