Lua语言基础

Lua是一款免费、小巧、快速且容易移植的,由标准C编写而成的最快、最高效的脚本语言之一。Lua的内核小于120KB,远小于Python的860KB和Perl的1.1MB,是游戏开发理想的选择。
Lua可使用Eclipse的Lua Development Tools(LDT)进行编译及调试。

  1. 第一个程序

     通常,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表示在当前对象中查找操作,如果当前对象中没有,就会到原型对象中查找操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值