Lua程序设计 table(表)

     Table是Lua中主要数据结构机制,基于Table,可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其他数据结构。Table是没有固定大小的,可以动态地添加任意数量的元素到一个Table中。

      Lua中的table类型实现了“关联数组”。可以在“关联数组”中使用整数、字符串或其他类型的值(nil除外)来索引它。

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

a = {}   --创建一个table,并将它的引用存储到a
k = "X"
a[k] = 10  ---新条目,key = "X" , value = 10
print(a["X"])    --->10

a[20] = "great"  -- 新条目,key = 20, value = "great"
k = 20
print(a[k])      -->"great"
a["X"] = a["X"] + 1
print(a["X"])   --- > 11

  Table 永远是"匿名的",一个持有Table的变量与Table自身之间没有固定的关联性。

a = {}
a["X"] = 10
b = a          --- b与a引用了同一个Table。
print(b["X"])  --- 10
b["X"] = 20
print(a["X"])   --- 20
a = nil         --现在只有b还在引用Table
b = nil         --再也没有对Table的引用了。 
一个Table的多个引用在对Table进行修改,修改的是全局的概念。当一个程序再也没有一个Table的引用时,Lua的垃圾收集器最终会删除该Table,并复用它的内存。

    所有Table都可以有不同类型的索引来访问value值,当需要容纳新条目时,Table会自动增长。

a = {} --空的table
-- 创建1000个新条目
for i = 1, 1000 do a[i] = i*2 end
print(a[9])  --> 18
a["X"] = 10
print(a["X"]) -->10
print(a["y"]) -->nil  当table的某个元素没有初始化时,他的内容就是nil。另外可以像全局变量一样,将nil赋予table的某个元素来删除该元素。(Lua中,全局变量也是存储在一个普通的table中)

    为了表示一条记录,可以将字段名作为索引。lua中有“语法糖”的概念:

a["name"]  ==  a.name

    若是要表示一个传统的数组或线性表,只需以整数作为key来使用table即可。Lua中数组通常以“1”作为索引的起始值。

     在Lua5.1中,长度操作符“#”用于返回一个数组或线性表的最后一个索引值!

     对于所有未初始化的元素的索引结果都是nil。Lua将nil作为界定数组结尾的标志。当一个数组有“空隙”时,即中间含有nil时,长度操作符会认为这些nil元素就是结尾标记。如果需要处理那些含有“空隙”的数组,可以使用函数table.maxn,它将返回一个table的最大正索引数:

a = {}
a[10000] = 1
print(table.maxn(a))  ---》10000

    当对索引的实际类型不是很确定时,可以明确地使用一个显示的转换:

i = 10 j = "10"  k = "+10"
a = {}
a[i] = "one value" 
a[j] = "another value" 
a[k] = "yet another value" 

print(a[j]) --->another value
print(a[k]) --->yet another value
print(a[tonumber(j)]) --->one value

转载于:https://my.oschina.net/u/223340/blog/289115

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值