前言
以前我们要遍历一个table的是否往往会是用for
循环,如果不是数字索引的表只能使用pairs
了,今天这个函数提供了一个方法,就是不断的查询下一个元素的索引和对应的值,来达到遍历table的目的,接下来我们一起来看一下实现的方法。
内容
next()
-
next(table [, index])
-
解释:使程序可以遍历表table的所有字段。他的第一个参数是一个表,第二个参数是一个表中有效的索引。函数会返回表中相对于指定索引的下一个索引和索引位置的值,当我们将第二个参数设置为
nil
调用函数时,函数会返回这个表的初始索引和该索引位置的值,当我们使用表的最后一个索引或者在空表中使用nil
做索引时,函数就会返回nil
。当我们省略第二个参数时,它会被默认解释成nil
。特别的,你可以使用next(t)
的形式来检测表是否为空。 -
使用这个函数获得的索引是未指定顺序的枚举,即使是对于数字类型的索引也是一样(如果要以数字的顺序遍历一个表,应该是使用数字类型的
for
或者是ipairs
函数)。 -
函数如果在遍历期间你给一个并不存在的字段赋值,其行为的结果是未定义的。不过你可以修改已经存在的字段,也可以清除已经存在的字段。
Usage
- 首先我们新建一个文件将文件命名为nexttest.lua然后编写代码如下:
-- 定义一个测试表
local tab = {
x = 1,
y = 66,
[100] = 100,
[3] = 3,
}
-- 判断表是否为空
local index, value = nil, nil
index, value = next(tab)
if index ~= nil then
print("\ntable tab is not nil")
end
-- 遍历table
print("\ntraverse table result:")
while index ~= nil do
print("[\""..index.."\"] = "..value);
index, value = next(tab, index)
end
index = "x"
index, value = next(tab, index)
-- 再次遍历table
print("\ntraverse table again result:")
while index ~= nil do
print("[\""..index.."\"] = "..value);
index, value = next(tab, index)
end
-- 传入最后索引
local ret = next(tab, 100)
print("\nlast index test ret is", ret)
-- 传入空表
local ret = next({}, nil)
print("\nnil table test ret is", ret)
-- 传入不存在索引
local ret = next(tab, 1000)
print("\nerror index test ret is", ret)
- 运行结果
总结
- 函数的解释中所要注意的问题我在例子中都做了测试,大家看一下测试结果接就好。
- 其中最需要注意的就是在函数的遍历期间向表中添加数据的情况,这种结果未定义,我们要尽量避免。
- 当传入无效索引时函数会报错,所以还不是不要随便传入一个索引,而应该使用这个函数返回的索引
网友评论