lua学习(5)______table表和函数

来源:互联网 发布:yii2 cms 编辑:程序博客网 时间:2024/06/05 17:16


今天我们所讲的table表函数都是lua中最重要也是最核心的基础类型,包括后面许多lua的特性都是由这两个衍生出来的。所以这节大家需要仔细学习,把细节弄明白。


首先是table表:


如果大家学过其他编程语言,可能会知道数据结构这样一个概念。数据结构就是程序中相互之间存在一种或多种特定关系的数据元素的集合。恩这么说可能有点抽象,比如说C语言中的数组、结构体、链表各自就是一种数据结构。然而我们学习lua到现在发现lua的变量类型都是单一的类型,是不是lua中就没办法实现各种各样的数据结构呢?


答案肯定是NO,为了让lua的用户也能够使用数据结构,所以lua中有了table这个类型。这个类型可以看做是一个字典。也就是C/C++中的Map,Java的HashMap,C#的Dictionary。不过这些语言在定义这样一个字典类型的时候需要在申明的时候指出key,value的类型。比如:Map<string,int> a;这样就可以用一个string类型的对象做索引去对应一个int的值。但是在lua中创建table的时候并不需要指出key,value的类型。并且在一个table的key和value的类型可以不定。恩这就有点像Java里面HashMap<object,object>。好了扯的有点多了,我们现在来看看lua的table是怎么使用的:


首先创建一个table表:



怎么插入数据,怎么查找数据呢?


通过上面代码可以了解赋值和查询的方法,而且我们可以知道如果对于没有赋值的key其值为nil。

在上面的代码中,我们可以看到每个key都是字符串并且满足lua变量命名规范。所以对于这类key值的访问还有一种方式:


是不是这个方式就跟其他语言访问成员数据的方式很像呢?


好了table的基本使用说的差不多了,下面我们就来介绍一下如何用table来模拟数组和链表。

数组:其实数组就是key为连续数字的特殊情况。


不过有个地方值得注意一下就是数组中不允许出现值为nil的空隙,不过在实际应用中不会,也不应该出现这样的情况。


数组赋初值有没有更简单的方法呢?答案是有的,我们可以利用table的构造表达式 :


我们可以发现,table中数组默认是从1开始的,当然并不是说不可以从0开始,如果你愿意甚至可以从-1开始。但是lua中内置了一些对数组操作的函数,而这些函数都是默认数组从1开始,所以如果在使用table作为数组的时候尽量从1开始。这是和其他语言规定可能有出处的地方。值得注意!!!



至于使用table模拟链表,则我们还需要先说一下table表的第二种构造表达式 :



这种表达式给出了key和value,这样就 key = value 就相当于 table[key] = value。不过细小的朋友可能发现了。这里的key也是只能为字符串类型并且满足变量命名规范的。那如果我想要key为number类型或者以数字开头的字符串类型呢?



好了,有了以上的语法我们就可以来模拟链表这个数据结构了!




下面是函数的基本介绍:


先来看看一个简单的函数定义:



通过关键字function表示紧跟着的是一个函数的申明,然后给出函数名(可以没有),参数列表,函数体,最后以end结尾。


其实lua的函数和其他大多数脚本语言的都是类似的。return 用于函数的返回值。

这节我们主要是讲解一下:lua函数中的多值赋值的应用:传参返回


1.传参

lua中的函数传参也是利用了多值赋值的语法,实参在左,形参在右。如果实参多于形参那么多余部分会的值被丢掉;如果少于形参,那么多余的形参将会被赋予nil。

这个特性使得lua在函数调用过程中更加随性,而且可以很方便的实现某些效果:比如函数对参数有默认值。



2.返回值,同样的,我就不累赘叙述了,直接看例子吧:





好了好了,还有最后一个知识点:变长参数


如果对于一个函数,如果我们想传入个数不定的参数怎么办呢?

如果参数类型都一样这很容易解决,就直接传一个数组进去就搞定了。

但是如果参数类型不一致呢?这个问题lua的变长参数就是用来解决这个问题的:





好了,这节内容基本上就结束了。下一节深入介绍一下lua的迭代器


0 0
原创粉丝点击