使用表来统一表示Lua中的一切数据,是Lua区分于其他语言的一个特色。这个特色从最开始的Lua版本保持至今,很大的原因是为了在设计上保持简洁。Lua表分为数组和散列表部分,其中数组部分不像其他语言那样,从0开始作为第一个索引,而是从1开始。散列表部分可以存储任何其他不能存放在数组部分的数据,唯一的要求就是键值不能为nil
。尽管内部实现上区分了这两个部分,但是对使用者而言却是透明的。使用Lua表,可以模拟出其他各种数据结构——数组、链表、树等。
虽然设计上简洁,并且对使用者更加透明、友好,但是如果使用不当,还会造成效率性能上的差异。
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组:
======================================================
序号 | 方法 & 用途 |
---|---|
1 | table.concat (table [, sep [, start [, end]]]): concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。 |
2 | table.insert (table, [pos,] value): 在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾. |
3 | table.maxn (table) 指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现) |
4 | table.remove (table [, pos]) 返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。 |
5 | table.sort (table [, comp]) 对给定的table进行升序排序。 |
table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
-- 简单的table mytable = {} print("mytable 的类型是 : ", type(mytable)) mytable[1] = "Lua" mytable["wow"] = "修改前" print("mytable 索引为1 的元素是 : ", mytable[1]) print("mytable 索引为wow 的元素是 : ", mytable["wow"]) --alternatable和mytable的是指向同一个table alternatable = mytable print("alternatable 索引为1 的元素是 : ", alternatable[1]) print("alternatable 索引为wow 的元素是 : ", alternatable["wow"]) alternatable["wow"] = "修改后" print("mytable 索引为wow 的元素是 : ", mytable["wow"]) -- 释放变量 alternatable = nil print("alternatable 是 ", alternatable) -- mytable仍然可以访问 print("mytable 索引为wow 的元素是 : ", mytable["wow"]) mytable = nil; print("mytable 是 " , mytable);
运行结果:
=========================================================================
table.insert (table, [pos,] value):在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
table.remove (table [, pos])返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
fruits = {"banana","orange","apple"} -- 在末尾插入 table.insert(fruits, "mango") print("索引为4的元素为 : ", fruits[4]); --在索引为2的键处插入 table.insert(fruits, 2, "grapes") print("索引为2的元素为 : ", fruits[2]) print("最后一个元素为 : ", fruits[5]) table.remove(fruits) print("移除后最后一个元素为 :",fruits[5])
运行结果:
=======================================================================
function table_maxn(t) local mn = 0; for k,v in pairs(t) do if mn < k then mn = k; end end return mn; end tb1 = {[1] = "a",[2] = "b",[3] = "c",[26] = "z",} print("tb1 长度 : ", #tb1) print("tb1最大值 : ", table_maxn(tb1))
运行结果:
后记:
在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。
因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。
本文出自 “享受科技带来的快乐” 博客,请务必保留此出处http://liam2199.blog.51cto.com/2879872/1961897
原文地址:http://liam2199.blog.51cto.com/2879872/1961897