Lua学习笔记-day5: 数组、迭代器

[]Lua数组

  1. 特点:

    1. 数组中的元素的数据类型是相同的。

    2. 索引以整数表示,索引起始值为1.

    3. 数组大小是不固定的。(不同于C中的数组,与python中的list类似。)

  2. 一维数组:

    1. 示例1:

      1. arr = {"one", "two"}

      2. for index = 0,2 do

        1. print(arr[index])

      3. end

    2. 结果1:依次输出nil, one, two。--输出nil的原因是,数组索引从1开始。

    3. 示例2:

      1. arr = {}

      2. for index = -2, 2 do

        1. arr[index] = index * 2

      3. end

    4. 结果2:依次输出:-4, -2, 0, 2, 4 --数组索引可以是负数。

  3. 多维数组:数组中包含数组。

[]Lua迭代器

  1. 定义:

    1. 迭代器(iterator):是一种对象,能够用来遍历标准模板库容器中的部分或全部元素;

    2. 每个迭代器对象代表容器中的确定的地址;

    3. 常常用函数来描述迭代器,每次调用该函数,就返回集合的下一个元素。

    4. Lua中的迭代器包含以下两种类型:

      1. 无状态的迭代器。

      2. 多状态的迭代器。

  2. 泛型for迭代器:

    1. 特点:

      1. 泛型for在自己内部保存了:迭代函数、状态常量、控制变量。

      2. 泛型for迭代器提供了集合的key/value对。

    2. 语法:

      1. for key, value in pairs(t) do

        1. print(key, value)

      2. end

      3. 说明:

        1. key, value:变量列表。

        2. pairs(t):表达式列表。

    3. 示例:

      1. arr = {"one", "two"}

      2. for key, value in ipairs(arr) do

        1. print(key, value)

      3. end

      4. 结果:依次输出: 1 one\n 2 two

      5. 说明:ipairs()是Lua提供的默认的迭代函数。

    4. 泛型for的执行过程:

      1. 初始化,计算in后面表达式的值。表达式返回泛型for需要的三个值:迭代函数、状态常量、控制变量。赋值过程与多赋值语句一样。

      2. 将状态常量和控制变量作为参数调用迭代函数。

      3. 将迭代函数的返回值,赋值给变量列表。

      4. 返回nil后,结束循环。

        1. 示例:

          1. arr = {"one", "two", nil, "three"}

          2. for key, value in ipairs(arr) do print(value) end

        2. 结果:依次输出one, two。--迭代函数返回nil后,循环结束,因此不会输出three。

      5. 返回第2步继续循环过程。

  3. 无状态的迭代器:

    1. 特点:

      1. 不保留任何状态的迭代器;

      2. 避免了创建闭包花费额外的代价;

    2. 最典型的例子是:ipairs()

    3. 示例(实现数字n的平方):

      1. function square(iteratorMaxCount, currentNumber):

        1. if (currentNumber < iteratorMaxCount)

        2. then

          1. currentNumber = currentNumber + 1 

          2. return currentNumber, currentNummber * currentNumber

        3. end

      2. end

      3. for index, value in square, 3, 0 do print(value) end

    4. 结果:依次输出1, 4, 9

    5. 说明:square, 3, 0分别是泛型for中的迭代函数,状态变量,控制变量。

  4. 多状态的迭代器:

    1. 特点:不仅仅需要简单的状态常量和控制变量,还需要保存多个状态信息。

    2. 保存状态信息的方式:

      1. 闭包;

      2. 将状态信息保存到table内,将table作为迭代器的状态常量。

    3. 示例(闭包):

      1. function elemIterator(collection)

        1. local index = 0

        2. local count = #collection --获取集合的元素个数

        3. return function () --闭包函数;匿名函数,没有参数。

          1. index = index + 1

          2. if index <= count

          3. then

            1. return collection[index]

          4. end

        4. end

      2. end

      3. arr = {"one", "two", "three"}

      4. for value in elemIterator(arr) do print(value) end

    4. 结果:依次输出one, two, three。

    5. 说明:

      1. for循环运行前,elemIterator()先运行,返回闭包函数,作为迭代器函数;

      2. for循环每次运行时,调用一次闭包函数。

  5. ipairs和pairs和区别:

    1. pairs: 迭代table,可以遍历表中所有的key可以返回nil。

    2. ipairs: 迭代数组,不能返回nil,遇到nil则退出。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值