注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Lua战记3——基本数据结构  

2012-01-24 15:46:52|  分类: Lua学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

Lua战记3——基本数据结构

LUA的基本数据结构很简单,只有这一个,即table,你可以把它理解成数组,这样对你来说,学习会轻快一些,但请注意,这是不对的,虽然你这么用,不会出错,可是这个table更强大,更方便。

table可以实现普通的数组、符号表、集合、队列、记录和其它数据结构,也可以通过其实现module(模块)、package(包)、object(对象) 。先简单的介绍一下实现数组的方法,后面会具体的介绍其它的几种情况。

table是associative array(关联数组)的实现,是一种具有特殊索引方式的数组,既可以通过整数也可以通过其它如字符串等来索引,是不是有点儿象C#里面的索引啊。

mytable = {}    --创建一个数组,并将其引用存储到mytable

mytable[0] = 123

mytable[1] = “table”

mytable[“hash”] = “hashtable”

 

for key,value in mytable do

    print(key.. “=” .. mytable)

end

 

输出的结果:

0=123

1=table

hash = hashtable

注意:..是用来进行字符串连接的,如果其前面是数字,一定要有一个空格,否则会把连接符号处理成小数点,这一点很重要。

lua中的table 可以嵌套,可以理解成是多维数组

mystr=”mytest”

mynesting =

{

first=0,

mystring=”string0”,

{x=0,y=0},

{x=1,y=1}

{x=2,y=2}

}

mynesting[mystr] = “1111”

 

print(mynesting [“first”])

print(mynesting [2].x)

print(mynesting [mystring])----这个木有

print(mynesting[mystr])

 

这个表的最后就是又建立一个无名的table.

运行结果:

0

1

nil

1111

 

另外还有一种情况,看下面的例子:

a = {}

b =a

a[“first”] = a;

b=a;

print(b.first)

b.first = 20

print(b.first)

a=nil      //此处a为空,但b不为空

b=nil      //此处全为空

 

其实和java和C#中的引用计数器有异曲同工之妙。

这其中一些注意的是:a.first等价a[“first”]但不同于a[first],大家如果有什么疑问上机一试即可。不过,为了和别的语言的阅读方式相同,建议写记录时使用前者,字符串数组(hashtable 等)之类时使用后者。

给一个table的项赋值为nil,意思是删除这项,如果访问一个table中没有的表项,则直接返回一个nil,这个好吧,不象C、C++中直接崩溃。

在lua5.1中,#这个关键字更方便的提供了操作table的方法,长度操作符#用于返回数组或者线性表的最后一个索引值(或者为其大小),如下:

for i = 0,#a do

    print (a[i])

end

几个常用用法:

a[#a] = nil         //删除最后一项

a[#a + 1] = 10      //在最后一项后添加一项,是不是和STL库中的队列啥的有相似之处

print(a[#a])        //打印最后一项

 

看这个:

for i=1,10 do

    a[#a+1] = i+100

end

结果是:101,102,…110

还要注意一下数组有空洞(hole),比如:

a={}

a[100] = 100

前面99个未初始化的值默认都为 nil,而字符串的长度函数遇到nil就认为数组截止,所以一定要注意,这时可以使用table.maxn这个函数来得到最大的正索引值。

还有一个需要注意的地方:数组的下标开始和C一样。

  评论这张
 
阅读(1490)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017