Lua中的for循环
Lua中的for循环有两类
- 数值for循环
- 泛型for循环
数值循环
格式如下
for var = exp1,exp2,step do
--执行体
end
var 从 exp1 变化到 exp2,每次变化以 step为步长递增 var,并执行一次 “执行体”。step是可选的,如果不指定,默认为1。
泛型循环
泛型 for 循环通过一个迭代器函数来遍历所有值,泛型循环有两种格式
for k,v in pairs(tab) do
print(k,v)
end
for k,v in ipairs(tab) do
print(k,v)
end
直接上代码:
table1 = {
"Lua",
"TypeScript",
"JaveScript",
"Python",
"C++"
}
for k,v in pairs(table1) do
print("pairs的输出结果 ==",k,v)
end
pqrint("===============华丽的分割线========================= ")
for k,v in ipairs(table1) do
print("ipairs的输出结果 == ",k,v)
end
运行结果:
pairs的输出结果 == 1 Lua
pairs的输出结果 == 2 TypeScript
pairs的输出结果 == 3 JaveScript
pairs的输出结果 == 4 Python
pairs的输出结果 == 5 C++
===============华丽的分割线=========================
ipairs的输出结果 == 1 Lua
ipairs的输出结果 == 2 TypeScript
ipairs的输出结果 == 3 JaveScript
ipairs的输出结果 == 4 Python
ipairs的输出结果 == 5 C++
这样看起来,两种循环没什么区别,别急,看代码:
table1 = {
"Lua",
"TypeScript",
["3"] = "JaveScript",
"Python",
"C++"
}
for k,v in pairs(table1) do
print("pairs的输出结果 == ",k,v)
end
print("===============华丽的分割线========================= ")
for k,v in ipairs(table1) do
print("ipairs的输出结果 == ",k,v)
end
运行结果:
pairs的输出结果 == 1 Lua
pairs的输出结果 == 2 TypeScript
pairs的输出结果 == 3 Python
pairs的输出结果 == 4 C++
pairs的输出结果 == 3 JaveScript
===============华丽的分割线=========================
ipairs的输出结果 == 1 Lua
ipairs的输出结果 == 2 TypeScript
ipairs的输出结果 == 3 Python
ipairs的输出结果 == 4 C++
这种情况说明,
- ipairs的key值只能是整型,而且必须是从1开始升序的整数,如果不是整型,取不到对应的value;
- pairs的key值可以是任何类型,优先输出key为整数(按升序的顺序)的value值;
再来看下面的例子:
table1 = {
"Lua",
"TypeScript",
nil,
"Python",
"C++"
}
for k,v in pairs(table1) do
print("pairs的输出结果 == ",k,v)
end
print("===============华丽的分割线========================= ")
for k,v in ipairs(table1) do
print("ipairs的输出结果 == ",k,v)
end
运行结果:
pairs的输出结果 == 1 Lua
pairs的输出结果 == 2 TypeScript
pairs的输出结果 == 4 Python
pairs的输出结果 == 5 C++
===============华丽的分割线=========================
ipairs的输出结果 == 1 Lua
ipairs的输出结果 == 2 TypeScript
这个说明:pairs中如果有nil的话,不会影响到循环,它为继续循环,而ipairs中如果有nil的话,会终止循环。