• Lua学习笔记(四):表和数组


    在Lua中,表(table)是十分重要的一种数据结构,实际上Lua对于复杂数据类型也仅提供了表给我们,我们通过表可以实现我们需要的大部分重要的数据结构,比如数组。

    table类型实现了关联数组,关联数组是一种具有特殊索引方式的数组;不仅可以通过整数来索引它,还可以使用字符串或其它类型的值(除了nil)来索引它。此外,table没有固定的大小,可以动态得添加任意数量的元素到一个table中。

    在Lua中,table既不是“值”,也不是“变量”,而是对象。可以将table想象成一种动态分配的对象,程序中仅仅有一个队它们的引用(指针)。table的创建是通过“构造表达式”完成的,最简单的构造表达式就是{}。

    定义表和设置属性

    有3种定义属性的方式和2种获取属性的方式:

    1 obj = {a=100, d="hello"}--创建时设置属性
    2 obj.b = "abc"--使用 . 号创建
    3 obj["c"] = true--使用索引创建
    4 
    5 print(obj.a)--使用 . 号创建
    6 print(obj["b"])--使用索引创建

    遍历表

    我们可以使用for循环对表进行遍历,如下:

    1 days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
    2 
    3 --i 表示索引, v 表示值
    4 for i,v in ipairs(days) do
    5   print(i, v)
    6 end

    内置方法

    Lua给我们提供了一些操作表的方法,比如table.concat等,所有的方法可以查看lua的帮助:http://www.lua.org/manual/5.2/contents.html#index

    数组

    Lua并没有提供专门的数组对象来对数组进行操作,但是我们可以使用table来实现数组。

    定义数组

    不同于table表,初始化数组时不需要填写key,而数组始终使用数字作为其key:

    1 arr = {1, "abc", 2, true}--定义数组
    2 print(arr[1])--注意索引从 1 开始

    我们要特别注意的就是Lua中数组的索引是从1开始的。

    使用内置方法处理数组

    Lua为我们提供了一些标准的方法来处理数组,我们来具体看看。

    table.insert

    强指定的值插入到指定的位置,如下:

    1 arr = {}
    2 
    3 for i = 1, 5 do
    4   table.insert(arr,1,i)
    5 end
    6 
    7 for key, var in ipairs(arr) do
    8     print(key, var)
    9 end

    我们看下输出:

    1 1    5
    2 2    4
    3 3    3
    4 4    2
    5 5    1

    我们每次都是把数据插入到第一个位置,所以以前的元素都会后移,故打印出来的值的结果就是从5到1。

    table.maxn

    获取数组最大的索引值,由于lua索引是从1开始的,所以最大的索引值就是数组元素的总数。

    还有其他的操作方法大家可以参考帮助,最后需要特别注意的一点是,小心不要操作到不存在的索引,会导致运行卡死。

    获取数组长度

    在Lua中可以使用“#”号和table.maxn两种方法来获取数组的长度,我们看看他们之间的区别:

    1 arr = {1,2,3,4,5,6}
    2 print(#arr)--6
    3 print(table.maxn(arr))--6
    4 
    5 arr[9] = 9
    6 print(#arr)--6
    7 print(table.maxn(arr))--9
    1. 都仅统计数字key的长度;
    2. #号是表示从1递增到空项的长度;
    3. table.maxn是表示所有数字key中最大的那个key的索引值;

    数字索引和字符串索引

    在Lua中,数字key和字符串key是不会混合到一起的,我们可以具体来看看:

    1 arr = {}
    2 arr[1] = 1
    3 arr["1"] = "abc"
    4 print(#arr, table.maxn(arr), arr[1], arr["1"])--1 1 1 abc
  • 相关阅读:
    Azure 中 Linux 虚拟机的大小
    排查在 Azure 中创建、重启 Linux VM 或调整其大小时发生的分配故障
    如何在 Azure 中的 Linux 经典虚拟机上设置终结点
    针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除
    Linux 内核超时导致虚拟机无法正常启动
    Java并发编程(十三)同步容器类
    可以开发着玩一下的web项目
    org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication canc
    FastDFS单机搭建以及java客户端Demo
    做前端(单纯页面和js)遇到的问题辑录(一)
  • 原文地址:https://www.cnblogs.com/hammerc/p/4707163.html
Copyright © 2020-2023  润新知