Lua是一款免费、小巧、快速且容易移植的,由标准C编写而成的最快、最高效的脚本语言之一。Lua的内核小于120KB,远小于Python的860KB和Perl的1.1MB,是游戏开发理想的选择。
Lua可使用Eclipse的Lua Development Tools(LDT)进行编译及调试。
第一个程序
通常,hello world程序都是学习一门语言的第一个程序,Lua编写的hello world程序非常简单,具体如下:
local function HelloWorld()
local msg='hello world'
print(msg)
end
HelloWorld()
运行结果如下:
其中print()函数将msg变量内容输出到控制台,local修饰的变量为局部变量,作用范围为它所在的函数,而未加local修饰的变量则为全局变量。
2.常量和变量
Lua中的常量和变量并没有什么区别,只是为了规范起见,一般要求大写常量标识符。
基本命名规范:
常量一般大写,变量一般小写,对象等类型通常每个单词的第一个字母大写,其他小写。函数则往往由多个名词组成,第一个单词通常为动词,并以小写字母开始,并在后面每个单词开始时使用大写。
3.注释
Lua中的注释包括单行注释和多行注释。
单行注释:
-- if x>1 then
多行注释:
--[[
if x>1 then
else
return
end
--]]
4.Lua中的基本数据类型
Lua是动态类型,所以应在赋值的时候就确定变量的类型。Lua中的数据类型分为数值类型(number)、布尔类型(boolean)、字符串类型(string)、自定义类型(userdata)、函数类型(function)、线程(thread)、表类型(table)、空值(nil)
string类型可以用“”也可以用‘’
自定义类型可以用来与C进行交互
线程可以同时执行多个,每个线程拥有自己独立的栈,局部变量和指令指针。
table类型实现一组关联数组类型,使用{}表示,表类型的访问有2种方式:
local point={x=1,y=2}
print(point["x"]) //也可用单引号
print(point.y)
nil是Lua中的特殊类型,表示没有有效值的情况。变量被赋值前默认为nil,如果变量被赋值为nil,则Lua的垃圾回收器会删除该变量,并释放其内存。
type()可以返回指定变量或者数值的类型:
print(type({x=1,y=2})) //输出table
Lua中的数据类型转换:
利用tostring()实现布尔类型和数值类型到字符串类型的转换。
local num=1;
print(tostring(num)) //输出"1"
local tb=tonumber({x=1,y=2})
print(tostring(tb)) //输出nil
利用tonumber()实现原始值到数值的转换:
local num=tonumber("10") //返回10
local num=tonumber({x=1,y=2}) //返回nil
local num=tonumber("AF",16) //返回175
tonumber()有2个参数,第一个参数为转换的目标,第二个参数默认为10,可缺省,表示目标数值的进制。
5.控制语句
Lua中的控制语句主要包括:
分支语句:if
循环语句:while,repeat ,for
跳转语句:break ,return
分支语句即条件语句,有if , if-else及else if三种结构
if x>1 then
语句组 //if语句
end
if x>1 then
语句组1
else //if-else语句
语句组2
end
if x>10 then
语句组1
else if x>9 then
语句组2 //else if结构
else if x>8 then
语句组3
end
循环语句主要包括while、repeat、for三种结构,while和for循环在执行循环体之前测试循环条件,而repeat则是在执行完循环体之后测试循环条件。即repeat结构至少执行一次循环体。下面是三种结构的语句格式:
while结构
while i*i<100 do
i=i+1 //Lua中不支持"+="等运算符
end
print(i)
repeat结构
i=0
repeat
i=i+1
until(i*i>100)
print(i)
for结构
for结构是用途最广泛的一种结构,也是功能最强的,for循环结构一般格式如下:
for var=exp1,exp2,exp3 do
body
end
其中var是循环变量,exp1是起始值,exp2为终止值,exp3为步长,其中exp3可以省略,默认为1
for循环可以帮助我们方便的遍历数组(table的一种)
local numbers={1,2,3,4,5} //numbers即为数组变量
for i,v in ipairs(numbers) do
print(i.. ":" ..v)
end
break与return的用法与C语言相同,在此不再赘述
6.表类型
表类型是Lua中唯一能够描述数据结构的类型,表类型可以描述多种数据结构。表类型本身是一种基于”键值对“的字典结构,可以描述数组、链表、队列及字典等。
表类型使用{}创建和初始化,{}被称为table构造器(constructor),在描述字典和数组时构造器的表示方式是不同的。字典结构的table构造器如下:
Student1={id='1',name='xy',age=20}
Student2={['id']='1',['name']='xy',['age']=20}
print(Student1['id']..Student1['name']..Student1['age'])
print(Student2.id..Student2.name..Student2.age)
两种创建及取值方式可以交叉使用。
可以使用for-in结构对字典进行遍历,代码如下:
Student1={id='1',name='xy',age=20}
for k,v in pairs(Student1) do
print(k..": "..v)
end
数组结构是一种特殊的table结构,数组结构的遍历方式如下:
local nameList={"a","b","c"}
for i,v in ipairs(nameList) do
print(i..":"..v)
end
for i,v in pairs(nameList) do
print(i..":"..v)
end
for i=1,#nameList do
print(i..":"..nameList[i])
end
注意Lua中的数组索引是从1开始的
ipairs函数用来遍历数组结构,而pairs函数则可以遍历table
#nameList可以获取nameList的长度
7.字符串类型
Lua中的String库提供了多种支持Lua中字符串操作的函数
local s="abc"
local slen=string.len(s)//获取字符串s的长度
local s="Hello Lua"
local sub1=string.sub(s,1,3)
local sub2=string.sub(s,2,-2)
print(sub1) //输出Hel
print(sub2) //输出ello Lu
string.sub(s,m,n),其中s为目标字符串,m为截取的起始位,n为截取的终止位,负值则倒数
local s='Abc'
print(string.lower(s)) //将字符串转为小写
print(string.upper(s)) //将字符串转为大写
print(string.rep(s,3)) //将目标字符串重复拼接
print(string.reverse(s)) //将目标字符串反转
输出如下:
local s='Hello Lua'
local i,j=string.find(s,'Hello') //返回字符串在目标字符串中的起始位置
print(i,j)
8.函数
Lua中的函数关键字为function。格式为:
function rectangleArea(width,height)
local area=width*height
return area
end
print(rectangleArea(1,2))
Lua的函数支持多重返回值,它的函数表达式可以同时赋给多个变量。
function res(width,height)
local area=width*height
local perimeter=(width+height)*2
return area,perimeter
end
local area,perimeter=res(1,2)
print(area,perimeter)
使用闭包表达式:
使用匿名函数形式的闭包表达式,代码如下
function getArea(type)
local returnFunction
if type=='rect' then
returnFunction=function(width,height) //闭包表达式
local area=width*height
return area
end
else
returnFunction=function(bottom,height) //闭包表达式
local are=0.5*bottom*height
return area
end
end
return returnFuntion
end
9 Lua中的面向对象
面向对象的基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。
Lua中并没有提供类的定义能力,但可以把表类型变量当作对象使用对象具有数据和操作。例如:
Student={id=100,name="Tony"}
function Student.toString()
local s="Name:"..Student.name.." id"..Student.id
return s
end
toString()只能属于Student对象,这种属于特定对象的函数被称为“方法”
在面向对象的语言中一般都有代替本身对象代词,JAVA和C++中使用this,Lua中使用self表示自身对象
Student={id=100,name="Tony"}
function Student:toString()
local s="Name:"..self.name.." id:"..self.id
return s
end
print(Student:toString())
类是对象的模板,一个类可以创建出多个对象
Student类的示例代码如下:
Student={id=100,name="Tony"}
function Student:toString()
local s="Name:"..self.name.."id:"..self.id
return s
end
function Student:create(o)
o=o or{}
setmetatable(o,self)
self.__index=self
return o
end
student1=Student:create({id=200,name="Tom"})
print(student1:toString())
student2=Student:create({id=300,name="Ben"})
print(student2:toString())
setmetatable(o,self)把self当作元表(Metatable)设置给o对象。每一个table都可以加上元表,元表可以改变相应的table的行为。
self.__index=self表示在当前对象中查找操作,如果当前对象中没有,就会到原型对象中查找操作。