`
gaotong1991
  • 浏览: 91292 次
  • 来自: 北京
社区版块
存档分类
最新评论

Lua银弹之table

阅读更多
来做一个Brain Storm,细数一下你曾经使用过的数据结构: map, hash_map, array, queue, stack, heap...或许还有很多其它的数据结构,相信在开始接触每个数据结构的时候都花了很多的时间去了解它们的特性,因为他们每一种都是足够的复杂。那么作为一个简单至极的语言,Lua是怎么实现这些的呢?答案是Lua中根本没有这些数据结构,汗了吧!更汗的是,Lua其实只一个真正意义上我们所谓的数据结构table,所以在这个简单的语言中我们可以使用的只能table这一种数据结构,下面我们来看一下这个神奇的table吧。

1, 我们可以使用table来实现一个数组 array = {1, 2, 3},这是一个大小为3的数组(*注其索引是从1开始的),可以使用#array来获取数组的大小即 #array = 3,也可以使用table.size(array)来获取数组的大小。这里array是一个变长的数组执行table.insert(array, 4),array就变成了{1,2,3,4}。table.remove(array, pos)来删除数组中指定位置的元素,其后面的元素都会相应前移。

2, 用table实现字典 dict = {[2] = 2, ["abc"] = "abc", [true] = false}, 由此可见lua字典的key值可以为任何的数据类型(nil除外),print(dict["abc"])会输出“abc"。那么现在有一个问题了,即然table即可以表示数组,又可以表示字典,如何区分呢?可以这样分类,如果像1那样不包含key值,它即是数组,也是字典,它也可以写成array = {[1] = 1, [2] = 2, [3] = 3},所以如果一个字典它的key值是从1开始按1递增的,效果同上。所以{1,2,3,[4] = 4} 等同于{1,2,3,4}和 {[1] = 1, [2] = 2, [3] = 3, [4] = 4}。而array = {1,2,3, [5] = 5}则会出现#array = 3,即前三项是一个数组,如果出现key不是整整形,效果同上。

3,table实现queue, stack, heap等原理同在c++中使用数组实现他们类似。

4,table也可以类似于C++的struct的使用如 tbl  = { year = 2014, date = 7 , month = 4}, 而使用的时候可以直接tbl.year, tbl, date, tbl.month来使用。

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics