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

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

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

定义表和设置属性

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

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

遍历表

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

 days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}

 --i 表示索引, v 表示值
for i,v in ipairs(days) do
print(i, v)
end

内置方法

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

数组

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

定义数组

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

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

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

使用内置方法处理数组

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

table.insert

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

 arr = {}

 for i = ,  do
table.insert(arr,,i)
end for key, var in ipairs(arr) do
print(key, var)
end

我们看下输出:


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

table.maxn

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

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

获取数组长度

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

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

数字索引和字符串索引

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

 arr = {}
arr[] =
arr[""] = "abc"
print(#arr, table.maxn(arr), arr[], arr[""])--1 1 1 abc

Lua学习笔记(四):表和数组的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. vue学习笔记(六)表单输入绑定

    前言 在上一章vue学习笔记(四)事件处理器这一篇博客的内容中,我们已经了解vue是如何绑定事件的,而本篇博客主要讲解的是vue中表单输入的绑定,通常我们自己提交信息的时候都是通过表单将信息到服务器的 ...

  3. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  4. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  5. python3.4学习笔记(四) 3.x和2.x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

  6. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  7. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  8. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  9. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  10. matlab学习笔记(一)单元数组

    matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x)  :取最大的整数 ceil(3.18)=4,ceil( ...

随机推荐

  1. bzoj1185

    一遇到数学题和计算几何题我就要调半天…… 玛雅,我真是太弱了…… 基本思路很简单,先上凸包,然后矩形与凸包一边重合,然后旋转卡壳即可 然而我没怎么写过计算几何题,一开始写的各种囧,后来看了hzwer的 ...

  2. OK335xS psplash Screen 移植

    /*********************************************************************** * OK335xS psplash Screen 移植 ...

  3. linux - markdown编辑器

    1. linux可以用web-qq,http://web2.qq.com,[我们从未放弃成长,这句话挺感动我的.] (禽兽!你怎么在一开始就跑题!?) ————我只要“及时预览”———— 2. htt ...

  4. 【转】Linux Posix Timer使用

    原文网址:http://blog.csdn.net/hongszh/article/details/8608781 最强大的定时器接口来自POSIX时钟系列,其创建.初始化以及删除一个定时器的行动被分 ...

  5. 也谈http中get和post

    1.get和post区别: 从设计初衷考虑get是为了查询服务器资源(不改变服务器数据及状态,因此说它是安全和幂等的,但get请求参数一般是直接在url后面,浏览器地址栏中会被看到能保存书签及历史记录 ...

  6. IOS 本地通知UILocalNotification

    //发送通知    UILocalNotification *notification=[[UILocalNotification alloc] init];       if (notificati ...

  7. C# 中如何判断某个字符串是否为空的方法 分享了三个方法来判断字

    1. 三种常用的字符串判空串方法:Length法:bool isEmpty = (str.Length == 0);Empty法:bool isEmpty = (str == String.Empty ...

  8. C++调用matlab实例

    这段代码是C++调用matab引擎的过程,代码的目的很简单,在C++中创建一个vector数组,然后将这个vector数组单位化.写这个代码的目的是学些C++与matlab之间的数据交互,以供日后参考 ...

  9. asmcmd报错

    在进入asm的命令行时报错: 报错内容如下 [oracle@kel dbs]$ asmcmd asmcmd: command disallowed by current instance type 从 ...

  10. 安装CPqD/ofdissector遭遇的错误

    为了安装支持openflow1.3的wireshark插件,在下载了ofdissector.git,并进入了其src目录后,执行scons install,出现如下错误: util/FieldMana ...