Lua脚本语言入门笔记
什么是Lua
Lua是一个小巧的脚本语言。是巴西里约热内卢天主教大学(PontificalCatholicUniversityofRiodeJaneiro)里的一个研究小组,由RobertoIerusalimschy、WaldemarCeles和LuizHenriquedeFigueiredo所组成并于1993年开发。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
Lua里的注释
单行注释
使用两个减号表示注释的开始,一直延续到行末位置。相当于C语言中的"//"。
--这里是一行注释 print("HelloLanou")
多行注释
使用"--[["表示注释开始,使用"]]"表示注释结束。这种注释相当于C语言中的"/*"和"*/"。
--[[这里是第一行注释 这里是第二行注释]] pring("HelloLanou")
Lua里的变量
在默认情况下,Lua里认为所有的变量都是全局变量。假如需要定义局部变量,则在声明变量时需要使用local说明。
并且在赋值的时候,允许同时给多个变量进行赋值。
--i是一个局部变量 locali=1 --name是一个全局变量 name="Lewis" --age,height都是局部变量 localage,height=34,183.5 --gender,company都是全局变量 gender,company="男","蓝鸥"
Lua里的运算符
算数运算符
--+(加法) print(1+2) ---(减法) print(1-2) --*(乘法) print(1*2) --/(除法) print(1/2) --^(乘方) print(1^2)
比较运算符
--<(小于) print(1<2) -->(大于) print(1>2) --<=(小于等于) print(1<=2) -->=(大于等于) print(1/2) --==(等于等于) print(1==2) --~=(不等于) print(1~=2)
逻辑运算符
在使用逻辑运算符时与C语言差别很大。
在Lua语言里,只有false和nil才为false,其他任何数据都是true,0也是true!!!
and和or的运算结果不是true和false,而是和他的两个操作数相关。
aandb:如果a为false,则返回a;否则,返回b;
aor b:如果a为true,则返回a;否则,返回b;
--and(与) print(1and2) --or(或) print(1or2) --not(非) print(1not2)
通过Lua里的这种特性,可以模拟C语言中的?:运算符
例如:C语言中的x=a?b:c,在Lua中,可以写成x=aandborc。
Lua里的数据类型
关键字
描述
nil
空值,所有没有使用过的变量都是nil;nil既是值,又是数据类型
boolean
布尔类型,只有两个有效的值:true和false
number
数值类型,在Lua里,相当于C语言里的double
string
字符串,如果愿意的话,字符串是可以包含"\0"字符的
table
关系类型,这个类型的功能比较强大
function
函数类型,可以由函数类型来声明变量
userdata
这个类型专门与Lua的宿主打交道。宿主通常是由c语言和c++语言开发的,在这种情况下,userdata可以是宿主的任何类型,常用的是结构体和指针类型
thread
线程类型,在Lua里没有真正的线程。
Lua里的代码块
在C语言中代码块是有"{"和"}"括起来的,在Lua中,使用do和end关键字括起来的。
do print("Hello") end
Lua里的关系类型
关系类型,是一个非常强大的类型。这个类型类似于C++语言里的映射结构,类似于PHP语言里的array对象,类似于OC里的NSDictionary对象。
在Lua里的关系类型(Table)定义很简单,它主要特征是使用"{"和"}"来括起来一系列的元素。
--声明一个关系类型的全局变量table table={} --赋值关系变量table索引为0时的值是34 table[0]=34 --同时也可以写成table.name="Lewis" table["name"]="Lewis" table.gender="男" --同样也可以将索引为"son"的对象写成另外一个表格 table["son"]={name="DD",gender="男"} --访问对象时就可以使用 print(table.son.name)
同样也可以如下声明
--声明关系变量table table={ 10,--相当于[1]=10 [100]=40, lewis={--同样也可以写成["lewis"]= age=34,--同样可以写成["age"]=34 gender="male", }, 20,--相当于[2]=20 } print(table[2])
Lua里的函数
在Lua中,函数的定义非常简单。不过要注意的一点就是,return语句一定要写在end之前。假如我们非要在函数中加一个return语句,那就应该写成。
do --return语句一定要在一个代码块结束前 return end
函数举例
--声明函数类型变量sum functionsum(v1,v2) --函数体 returnv1+v2 end --同样函数变量也可以如下声明 mul=function(v1,v2) --函数体 returnv1*v2 end --调用第一个函数sum print(sum(2,3)) --调用第二个函数mul print(mul(3,4))
Lua里的类
前边曾经说过,表类型可以拥有任意类型的值,包括函数!
因此,我们就可以创建一个具有函数变量的表。
lewis={ age=34, work=function(self,message) --函数体 self.age=self.age+1; print(self.age..message) end } print(lewis.age) lewis.work(lewis,"上班") --也可以如下调用方法 lewis:work("上班")
结束
就像C语言一样,Lua里提供了很多的标准函数库来增强语言的功能。使用这些函数,可以很方便的操作各种数据类型。
可以参考《ProgramminginLua》这本书。