table类型实现了“关联数组”。“关联数组”是一种具有特殊索引方式的数组。不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它。table是Lua中主要的数据结构机制(事实也是仅有的),具有强大的功能。基于table可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其他数据结构。

table的特性:

  • table是一个“关联数组”,数组的索引可以是数字或者是字符串
  • table 的默认初始索引一般以 1 开始
  • table 的变量只是一个地址引用,对 table 的操作不会产生数据影响
  • table 不会固定长度大小,有新数据插入时长度会自动增长

先看table的简单的例子:

> a={}  //空table
> k="x"
> a[k]=10
> print(a[k])
10
> a["x"]=a["x"]+1 //自增
> print(a["x"])
11

Lua提供了更简单的”语法糖“(syntactic sugar)

a.x=10 --print(a["x"]=10)
print(a.x) --等于print(a["x"])

table循环读入

for i=1,5 do
a[i]=io.read()
end

table循环输出

for i=1,#a do
print(a[i])
end

#a表示table a最后一个索引


table 的方法函数

1. concat

函数 table.concat 主要用来把表里的每个元素通过一个分隔符(separator)连接组合起来,语法如下:

table.concat(table, sep,  start, end)

sep、start、end 这三个参数都是可选的,并且顺序读入的,如果没指定传入,函数 concat 会采用默认值(分隔符 sep 的默认值是空字符, start 的默认值是 1, end 的默认值是数组部分的总长)去执行。

> tbl = {"one", "two", "three", "four"}
> print(table.concat(tbl))
onetwothreefour
> print(table.concat(tbl, " "))
one two three four
> print(table.concat(tbl, " ", 2))
two three four
> print(table.concat(tbl, " ", 2, 3))
two three

字符连接还有".."方式

a=a.."two"

2. insert

函数 table.insert 用于向 table 的指定位置(pos)插入一个新元素,语法:

table.insert(table, pos,value)

pos插入位置,可选项

> a={"one","two"}
> table.insert(a,"three")
> print(table.concat(a," "))
one two three

3. remove

语法:

table.remove (tb,pos)

参数 pos 可选,默认为删除 table 最后一个元素,并且参数 pos 的类型只能是数字 number 类型。

> tb={"one","two","three","four"}
> table.remove(tb,1)
> print(table.concat(tb," "))
two three four
> table.remove(tb)
> print(table.concat(tb," "))
two three

4.maxn

函数 table.maxn 是返回 table 最大的正数索引值,语法:

table.maxn(tb)
>tb={"one","two","three"}
> table.maxn(tb)
> print(table.maxn(tb))
3

5. sort

函数 table.sort 用于对 table 里的元素作排序操作,语法

table.sort(table,comp)

comp是一个比较函数

>tb={"one","two","three"}
> sort_comp = function(a, b) return a > b end
> table.sort(tb,sort_comp)
> print(table.concat(tb," "))
two three one

6. unpack

函数 table.unpack 用于返回 table 里的元素,语法:

unpack(table, start, end)

参数 start 是开始返回的元素位置,默认是 1,参数 end 是返回最后一个元素的位置,默认是 table 最后一个元素的位置,参数 start、end 都是可选

> a = {"one","two","three"}
> print(unpack(a))
one two three
> print(unpack(a,2))
two three
> print(unpack(a,2,3))
two three

7. pack

函数 table.pack 是获取一个索引从 1 开始的参数表 table,并会对这个 table 预定义一个字段 n,表示该表的长度, 语法:

table.pack(···)

该函数常用在获取传入函数的参数。

#!/usr/local/bin/lua
function table_pack(...)
args = pack(...)
print(args.n)
tmp={"one","two"}
print(tmp.n)
end
table_pack("test","arg2","arg3")

Lua学习(1)——table的更多相关文章

  1. lua学习之table类型

    关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中 ...

  2. lua学习项目笔记

    这几天草草的浏览了一下电子版的<lua程序设计>,没有懂的地方就自动忽略了,挑拣了一些可以理解的部分一直在推进.推进至后面的时候已经浑浑噩噩的了,有种想看完这本书的强迫症的感觉.推进CAP ...

  3. [转]LUA 学习笔记

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

  4. Lua学习笔记(二):基本语法

    Lua学习指南:http://www.lua.org/manual/ 首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量. Lua关键字 可以查看这个地址:http://www.lua.or ...

  5. Lua 学习笔记(一)

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

  6. lua学习:使用Lua处理游戏数据

    在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件. 其实lua在游戏开发中可以作为一个强大的保存.载入游戏数据的工具. 1.载入游戏数据 比如说,现在我有一份表单: data.xls ...

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

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

  8. lua学习之类型与值篇

    类型与值 lua 是动态类型的语言 在语言中没有类型定义的语法 每个值都携带有它的类型信息 8种基础类型 用 type 可以返回这个值的类型的名称 将一个变量用于不同类型,通常会导致混乱的代码 但合理 ...

  9. Lua学习高级篇

    Lua学习高级篇 之前已经说了很多,我目前的观点还是那样,在嵌入式脚本中,Lua是最优秀.最高效的,如果您有不同的观点,欢迎指正并讨论,切勿吐槽.这个系列完全来自于<Programming in ...

  10. LUA 学习笔记

    1.C# 与 LUAC#调用LUA比较简单,但LUA调用C#,有两种方法,一种是直接反射调用,但这种方法有局限性,比如性能低,在IOS平台无法使用反射,因此一般使用WARP方法,即把C#代码注册到LU ...

随机推荐

  1. C语言中关于三目运算符的注意事项

    C语言中常见的条件运算符?:在运算符优先级中排行13.部分时候可以代替if--else语句,使代码更加简洁.但是更容易隐含一些不易觉察的错误. 最近接了一个项目,本来通信协议部分很简单,自己的STM3 ...

  2. RHEL7对比RHEL6的主要变化

    RHEL7和RHEL6的主要变化 RHEL7和RHEL6的主要变化   RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo S ...

  3. NOIP2009T3最优贸易

    洛谷传送门 看到这个题,原本想先从后往前dfs,求出能到终点的点,再在这些点里从前往后spfa,用一条边上的两个城市的商品价格的差来作边权,实施过后,发现图中既有负边权,又有回路,以及各种奇奇怪怪的东 ...

  4. 从零到实现Shiro中Authorization和Authentication的缓存

    本文大纲 一.简介 二.缓存的概念 三.自定义实现缓存机制 四.什么是Ehcache 五.Ehcache怎么用 六.Spring对缓存的支持 七.Spring+Ehcache实现 八.Spring+S ...

  5. 使用上传插件 Web Uploader 上传图片到七牛云(C#)

    之前有写过一篇文章,基于asp.net mvc 封装 Web Uploader 上传插件: http://www.cnblogs.com/vanteking/p/5623682.html 已经实现的功 ...

  6. NSUserDefaults的使用,保存登录状态和设置的轻量本地化存储

    NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; if([[NSUs ...

  7. Asp.net Authorization 学习

    其实使用新的Identity以来一直有一个疑惑,之前的角色管理 在新的Identity中怎么管理的.[AspNetUserClaims] 在新的授权管理中又占什么位置 第一,根据角色授权,刚刚注册的用 ...

  8. 《分布式Java应用之基础与实践》读书笔记二

    远程调用方式就是尽可能地使系统间的通信和系统内一样,让使用者感觉调用远程同调用本地一样,但其实没没有办法做到完全透明,例如由于远程调用带来的网络问题.超时问题.序列化/反序列化问题.调式复杂的问题等. ...

  9. c/c++测试函数的运行时间(八种方法)

    目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但 ...

  10. 不须组件的NPOI插件 excel读取

    前提: 需要DLL  1.引用 using NPOI.SS.UserModel; using NPOI.XSSF.UserModel;//用于2007版本 using NPOI.HSSF.UserMo ...