查阅前辈的博文后,写出此码。
--[[
ipairs和pairs的区别
created by ZhangTao at 2016年11月7日00:07:14
--]]
--[[
迭代table元素的(pairs),迭代数组元素的(ipairs)
pairs可以遍历表中所有的key,可以返回nil;
ipairs不能返回nil只能返回0,如果遇到nil则退出迭代,
它从整数1开始递增遍历,(1遍历后遍历2,3)
中间不能断开,不然会退出循环,
且只能遍历到表中出现的第一个不是整数的key。
--]]
--test examples:
--第一个表
local tabFiles={
[3]="test2",
[6]="test3",
[4]="test1",
[2]="bbb",
}
--[[
在ipairs(tabFiles)遍历中,当i=1时候value就是nil,
所以直接退出循环不输出任何值。
但是在使用pairs(tabFiles)遍历时,不会如上,而是输出全部。
--]]
for i,v in ipairs(tabFiles) do
--print(i,v)
end
for k,v in pairs(tabFiles) do
--print(k,v)
end
--修改内容tabFiles
tabFiles[1]="testOne"
tabFiles[2]="testTwo"
for i,v in ipairs(tabFiles) do
--print(i,v)
end
print("------------")
for k,v in pairs(tabFiles) do
--print(k,v)
end
--第二个表
local tt={
[1]="test1",
[4]="test4",
[5]="test5",
}
for i,v in ipairs(tt) do --输出1 test1,在i=2时,退出遍历
--print(i,v)
end
print("------------")
for k,v in pairs(tt) do --全部输出
--print(k,v)
end
print("------------")
--第三个表
local Eng={
["1"]="replaceOneValue", --是字符串的下标 1 ,而不是数值的下标 1
[5]="duola",
"alpha", --没有显式说明值的下标,那么其下标默认为1,且优先级高于[1]
"beta", --下标递增,为2
[1]="lish", --由于优先级的原因,不管是使用哪种(共3种),都会被忽略
[3]="uno",
["two"]="dos",
}
for i,v in ipairs(Eng) do --输出3个: 1,2,3
--print(i,v)
end
print("------------")
for k,v in pairs(Eng) do --全部输出(除去被忽略了的)
--print(k,v)
end
print("++++++++++++")
for i=1,#Eng do --输出结果和ipairs一致。
--print(Eng[i])
end
print("------------")
--第四个表
--这是一道面试题
local mqkk={
[1]="a",
"b",
[100]="c",
}
for i=1 ,#mqkk do --只会输出b,而我当时回答的是a
print(mqkk[i])
end
for k,v in pairs(mqkk) do
--print(k,v)
end
--[[
面试官又问:那这个表使用ipairs和pairs来遍历结果又是如何呢?
通过对第三个表的遍历得知:
使用pairs: b 和 c 。
使用ipairs :只输出 b。
最后面试官问:那你知道ipairs和pairs的区别吗? 事后查找资料,然后有了此文档。
--]]