Lua base next()

作者: AlbertS | 来源:发表于2016-09-02 17:58 被阅读2253次
    下一站.jpg

    前言

    以前我们要遍历一个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)
    
    • 运行结果
    base_next.png

    总结

    • 函数的解释中所要注意的问题我在例子中都做了测试,大家看一下测试结果接就好。
    • 其中最需要注意的就是在函数的遍历期间向表中添加数据的情况,这种结果未定义,我们要尽量避免。
    • 当传入无效索引时函数会报错,所以还不是不要随便传入一个索引,而应该使用这个函数返回的索引

    相关文章

      网友评论

        本文标题:Lua base next()

        本文链接:https://www.haomeiwen.com/subject/aaxkettx.html