• Lua学习笔记(四)


    Lua数组

    一维数组

    array={"Lua","Java","C++"}
    for i=0,2 do
        print(array[i])
    end
    --[[
    输出结果:
    nil
    Lua
    Java
    结果分析:
    Lua索引值以1为起始,也可以指定0开始
    ]]
    -- 以负数为数组索引值
    array={}
    for i=-2,2 do
        array[i]=i*2
    end
    
    for i=-2,2 do
        print(array[i])
    end
    

    多维数组

    -- 初始化数组
    array={}
    for i=1,3 do
        array[i]={}
        for j=1,3 do
            array[i][j]=i*j
        end
    end
    
    -- 访问数组
    for i=1,3 do
        for j=1,3 do
            print(array[i][j])
        end
    end
    

    Lua迭代器

    一种对象,能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。

    在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素

    泛型for迭代器

    泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量

    泛型for的执行过程

    https://www.runoob.com/lua/lua-iterators.html

    Lua迭代器类型

    • 无状态的迭代器
    • 多状态的迭代器

    无状态的迭代器

    不保留任何状态的迭代器,每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。如:ipairs函数

    多状态的迭代器

    迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,方法:

    • 使用闭包(类似于lambda表达式,该表达式能包含函数本身以及外部引用变量,外部引用变量类似于lambda表达式中[]内捕获的外部变量)
    • 将所有状态信息封装到table内
    array={"Google","Apple"}
    
    function elementIterator(collection)
        local index=0
        local count=#collection
        -- 闭包函数
        return function()
            index=index+1
            if index<=count then
                return collection[index]
            end
        end
    end
    
    for element in elementIterator(array) do
        print(element)
    end
    --[[
    输出结果:
    Google
    Apple
    ]]
    

    Lua table(表)

    table是一种数据结构,可以用于创建不同的数据类型:数组、字典等

    table的特点:

    • 使用关联型数组,可以用任意非nil的类型作为数组的索引
    • 大小不固定,可以根据需要扩容
    • 可以用于解决模块(module)、包(package)和对象(Object)

    table的构造

    -- 初始化表
    mytable={}		-- 最简单的构造函数
    
    -- 指定值
    mytable[1]="Lua"
    
    -- 移除引用
    mytable=nil
    -- Lua垃圾回收会释放内存
    
    -- 注意:table间的赋值是传引用,两者指向同一个内存,只有当没有任何变量指向该内存(即所有table变量都指向了nil),Lua的垃圾回收机制才会清理相对应的内存
    

    table操作

    --[[
    作用:列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开
    参数列表:
    	table:操作对象
    	sep:分隔符
    	start:起始索引
    	end:末尾索引
    返回值:连接后的字符串
    ]]
    table.concat(table[,sep[,start[,end]]])
    
    --[[
    作用:在table的数组部分指定位置(pos)插入值为value的一个元素
    参数列表:
    	table:操作对象
    	pos:插入位置,默认为数组部分的末尾
    	value:插入的值
    返回值:
    ]]
    table.insert(table,[pos,]value)
    
    --[[
    作用:删除table数组部分位于pos位置的元素,其后的元素会被前移
    参数列表:
    	table:操作对象
    	pos:删除的元素位置,默认为最后一个元素的位置
    返回值:删除的元素的值
    ]]
    table.remove(table[,pos])
    
    --[[
    作用:对给定的table进行升序排序,数值按照数值大小,字符串按照首字母ASCCI码排序
    参数列表:
    	table:操作对象
    	comp:比较方法,接收两个参数,返回一个布尔值,为true不交换,为false交换
    返回值:nil
    ]]
    table.sort(table[,comp])
    
  • 相关阅读:
    多态与异常处理课后作业
    Java接口与继承作业
    大道至简第六章随笔
    大道至简第五章随笔
    Java数组课程作业
    大道至简第四章随笔
    String课后作业
    大道至简第三章随笔
    Java语法基础动手动脑实践
    大道至简-第二章 心得体会
  • 原文地址:https://www.cnblogs.com/JaxesZ/p/11217016.html
Copyright © 2020-2023  润新知