数据类型
Lua的基本数据类型主要有:nil、boolean、Number、String、function、userdata、threads
Nil:空,变量没有赋值,默认值是nil
Boolean:Lua中false和nil都看作假的,其它都是真
Number:Lua只有一种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中使用。后面介绍UserData和C语言的结合使用方法。
Threads:在lua中使用的是协程,和线程一样有自己独立的栈、局部变量、指令指针,以及可以和其它协程共享全局变量。协程和线程区别:线程可以运行多个,协程序任意时刻只能运行一个,协程只有挂起才会暂停。具体协程的应用在后边专门介绍。
表达式
算数表达式
二元运算符:+ - * / ^ (加减乘除幂)
一元运算符:- (负值)
算数表达式用于实数,例:x^0.5将计算x的平方根,x^3将计算x的3次方。
逻辑表达式
and or not
逻辑运算符认为false和nil是假(false),其他为真,0也是true
关系表达式:
< > <= >= == ~=
这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Table、function、userData类型,都是引用比较,也就是说,只有是同一个对象时候,才认为相等
连接表达式
.. --两个点
字符串连接,如果操作数为数字,Lua将数字转成字符串。由于Lua中字符串是不可改变的,所以连接操作符会创建一个新的字符对象,而不会修改原来的value
表的构造
在Lua中table既可以作为map使用也可以作为array使用。
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。也可以构造数组,数组下标从1开始。
1)构造表:
Local tb1 = {x=10, y=20}
local tb1 = {[“x”] = 10, [“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条件,循环的while、for、repeat-util语句,其中if、while、for都是以end结尾,而repeat以util结尾。同时lua不支持switch语句,但是我们可以通过程序实现这种控制结构
1)If:
在lua中false和nil是假的,其它都是真的
if conditionsthen
then-part
elseif conditionsthen
elseif-part
.. --->多个elseif
else
else-part
end;
2)while:
local a = 10
while a > 0 do
a = a - 1
-- Do something else
End
3)for:
数值型:
for var = exp1, exp2, exp3 do
-- Do something
End
var从exp1变化到exp2,每次变化都以exp3作为步长进行递增。第三个表达式exp3是可选的,若不指定的话,Lua会将步长默认为1
注意:
A、for的三个值exp1、exp2、exp3是在计算一次,并且是在循环开始前
B、Var会被自动声明为局部变量,在for的do...end中有效
泛型for循环:
Lua提供了基础的库函数,例如:ipairs:遍历数组;pairs遍历tables元素
4)repeat-util
--[ repeat loop execution --]
a = 10
repeat
print("value of a:", a)
a = a - 1
until( a < 0 )
只要a<0则终止循环
5)return/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