Lua之基本语法

数据类型

Lua的基本数据类型主要有:nilbooleanNumberStringfunctionuserdatathreads

Nil:空,变量没有赋值,默认值是nil

BooleanLuafalsenil都看作假的,其它都是真

NumberLua只有一种Number类型-double(双精度类型)

String:双引号或单引号,也可以使用[[]]表示一个字符块,例如:

html = [[

<html>

<head></head>

<body>

<a href="http://blog.csdn.net/code52/article/details/53843804">LUA深入浅出</a>

</body>

</html>

]]

print(html)

结果:

<html>

<head></head>

<body>

    <a href="http://blog.csdn.net/code52/article/details/53843804">LUA深入浅出</a>

</body>

</html>

Function作为一个特殊类型,也可以作为参数传递(和javascript一样)

Userdata是用户自定义数据,是用程序或C语言创建的新类型,例如场景,在C语言中创建struct,然后在lua中使用。后面介绍UserDataC语言的结合使用方法。

Threadslua中使用的是协程,和线程一样有自己独立的栈、局部变量、指令指针,以及可以和其它协程共享全局变量。协程和线程区别:线程可以运行多个,协程序任意时刻只能运行一个,协程只有挂起才会暂停。具体协程的应用在后边专门介绍。

表达式

算数表达式

二元运算符:+ - * / ^  (加减乘除幂)

一元运算符:-  (负值)

算数表达式用于实数,例:x^0.5将计算x的平方根,x^3将计算x3次方。

逻辑表达式

and    or     not

逻辑运算符认为falsenil是假(false),其他为真,0也是true

关系表达式:

<      >      <=     >=     ==     ~=

这些操作符返回结果为false或者true==~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。TablefunctionuserData类型,都是引用比较,也就是说,只有是同一个对象时候,才认为相等

连接表达式

..         --两个点

字符串连接,如果操作数为数字,Lua将数字转成字符串。由于Lua中字符串是不可改变的,所以连接操作符会创建一个新的字符对象,而不会修改原来的value

表的构造

Luatable既可以作为map使用也可以作为array使用。

构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。也可以构造数组,数组下标从1开始

1)构造表:

Local tb1 = {x=10, y=20}

local tb1 = {[“x”] = 10, [“y”] = 20}

tb1 ={};tbl.x=10; tbl.y=20;

这三种构造方式是完全一样的。获取表数据:print(tbx[“x”])print(tbl.x)也是一样的

2)构造数组:

local tbDays={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

print(tbDays[1])          -->Sunday

 

如果需要索引结构从0开始,则可以:

local tbDays = {[0]="Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}

print(tbDays[1])          -->Sunday

 

3)在构造函数的最后的","是可选的,可以方便以后的扩展

a = {[1]="red", [2]="green", [3]="blue",}

4)分割表的元素

在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。

{x=10, y=45;"one", "two", "three"}

赋值语句

Lua的特性:多重赋值

例如:local  x,y = 2,4

  Print(x)   -->2

      Print(y)   -->4

右边值的个数少于左边变量的个数,多余的变量赋值为nil,如果值的个数多了,则多余的会被忽略掉

控制语句

代码块与局部变量

代码块在lua中使用do...End区分,不适用分号”;”断行

Lua中使用local定义局部变量,没有local关键字的都是全局变量

do

     local a1= 10

     local a2= 10

end  

控制语句

所有的编程语言都有控制语句,对lua同样,lua支持的控制语句有if条件,循环的whileforrepeat-util语句,其中ifwhilefor都是以end结尾,而repeatutil结尾。同时lua不支持switch语句,但是我们可以通过程序实现这种控制结构

1If

luafalsenil是假的,其它都是真的

if conditionsthen 

    then-part

elseif conditionsthen

    elseif-part

..           --->多个elseif

else

    else-part

end;

2while

local a = 10

while a > 0 do

     a = a - 1

     -- Do something else

End

3for

数值型:

for var = exp1, exp2, exp3 do

     -- Do something

End

varexp1变化到exp2,每次变化都以exp3作为步长进行递增。第三个表达式exp3是可选的,若不指定的话,Lua会将步长默认为1

注意:

Afor的三个值exp1exp2exp3是在计算一次,并且是在循环开始前

BVar会被自动声明为局部变量,在fordo...end中有效

 

泛型for循环:

Lua提供了基础的库函数,例如:ipairs:遍历数组;pairs遍历tables元素

4repeat-util

--[ repeat loop execution --]

a = 10

repeat

   print("value of a:", a)

   a = a - 1

until( a < 0 )

只要a<0则终止循环

5return/break

两个都可以跳出循环代码块,但是return是函数返回结果,lua中的函数都有一个默认的return

函数

函数对各种编程语言都是至关重要的,同样LUA中的函数有一些自己的特性,由于各种语言的函数基本相同,这章重点介绍这些特性

语法

lua函数必须以end结尾

function testFunction(param)

Print(“hello Lua”)

end

函数调用

当函数只有一个字符串参数或者参数是table时候,可以不写圆括号,例如:

print "Hello World"    --> print("Hello World")等价

print [[a multi-line message]]  -->

print([[a multi-line message]])等价

-- f是一个函数

f{x=10, y=20}           -->f({x=10, y=20})等价

调用函数的实际参数和定义函数的形式参数个数可以不相同,Lua会自动调整数量,如果实参多与形参,则舍去多余的,如果实参少于形参,则多余的形参赋值为nil

多重返回值

function foo0() end                         --无返回值

function foo1() return "a" end          --返回一个结果

function foo2() return "a", "b" end     --返回两个结果

 

table构造式可以完整的接收一个函数调用的所有结果,即不会有任何数量,但是这种情况只有在函数调用作为最后一个元素是才会发生,在其它位置时候,只能获取一个结果,例如以下两种情况:

情况一(函数调用是表的最后一个元素):

local t = {foo0()}          -- t = {}(一个空的table)

local t = {foo1()}          -- t = {"a"}

local t = {foo2()}          -- t = {"a", "b"}

情况一(函数调用不是表的最后一个元素):

local t = {foo0(), foo2(), 4}  -- t[1] = nil, t[2] = "a", t[3] = 4

变长参数

1)基本用法:

Lua中可以向C语言、java一样接受长度不定的参数列表,使用(...)表示变长参数列表

--打印所有的参数

function VarArguments(...)

     for i, v in ipairs{...} do

          print(v)

     end

end

 

VarArguments(1, 2, 3)

2)固定参数加上可变参数

例如:

function g (a, b, ...)end

g(3)              a=3, b=nil, arg={n=0}

g(3, 4)           a=3, b=4, arg={n=0}

g(3, 4, 5, 8)     a=3, b=4, arg={5, 8; n=2}

Lua会将前面的实参传递给固定参数,后边的实参传递给arg表中。

3)获取变长参数

变长参数有时候需要故意设置某一个参数为nil,这时候获取参数就需要select了。用法:

for i = 1, select('#', ...) do

    local arg = select(i, ...) --得到第i个参数

    -- Do something else

End

select(#,)会返回所有变长参数的总数,其中包括nil

 

参考:

http://www.jellythink.com/archives/587

http://www.lua.org/download.html

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值