lua脚本的语法说明:
lua基本介绍:
lua的语法比较简单,学习起来业比较省力,但功能却并不弱。所以,我只简单的归纳一下lua的一些基本语法规则,使用起来方便好查就可以了。(在lua中,一切都是变量,除了关键字。)
1.注释
在程序中,总少不了注释。在lua中,你可以使用单行注释。
(1)单行注释:连续两个减号“--”表示注释的开始,一直延续到行末为止。相当于c++语言中的“//”。
(2)多行注释:由“--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于c语言中的“/*.....*/”。"[["和"]]是可以嵌套的(在lua5.1中,中括号中间是可以加若干个"=="的,如[==
[==[...]==]),见下面的字符串表示说明。
2.lua编程
经典的“hello world”的程序总是被用来开始介绍一种语言。在lua中,写一个这样的程序很简单:
在lua中语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,如果多个语句卸载同一行的话,建议总是用分号隔开。
lua有好几种程序控制语句,如:
控制语句 格式
if if条件 then...else 条件 then...else... end
While
Repeat repeat...until 条件
For for 变量=初值,终点值,步进do... end
For for 变量1,变量2,........变量n in表示或枚举函数 do...end for a ,b in mylist do print(a,b) end
注意一下,for的循环变量总是只作用于for的局部变量;当省略步进值时,for循环会使用1作为步进值。
使用break可以用来中止一个循环。相对于C语言来说,Lua有几个地方是明显不同的,所以面要特别注意一下:
.语句块
语句块在C中是和"{"和"}"括起来的,在Lua中,它是用来do和end括起来的,比如:
do print("Hello") end
可以在函数中和语句块中定局部变量
.赋值语句
赋值语句在lua被强化了。它可以同时给多个变量赋值。
例如:
a,b,c,d = 1,2,3,4
甚至是:
a,b= b,a --多么方便的变换功能啊。
在默认情况下,变量总是认为全局的。假如需要定义全局变量,则在第一次赋值的时候,需要local说明
比如:local a,b,c =1,2,3 --a,b,c都是局部变量
.数值运算
和C语言一样,支持+,-,*,/。但是lua多了一个"^",.这表示指数乘法运算。比如2^3结果为8,2^4= 16.
连接两个字符串,可以用".."运处符。如: "this a" .."string." -- 等于“this is a string”
.比较运算
比较符号 < > <= >=== ~=
含义小于大于小于等于大于等于相等不相等
所有这些操作符总是返回true或false
对于table,function 和 userdata 类型的数据,只有 == 和 ~= 可以用。相等表示两个变量引用的是同一个数据。比如:
a = {1,2}
b= a
print(a == b ,a ~= b) --输出true ,false
a= {1,2}
b= {1,2}
print(a==b,a~=b) --输出false,true
.逻辑运算
and,not ,or
其中,and 和or 与C语言区别特别大
在这里,请先记住,在lua中,只有false和nil才计算为false,其他任何数据都计算为true,0也是true!
and 和 or 的运算结果不是true和false ,而是和它的两个操作数相关。
a and b :如果a为false,则返回a;否则返回b
a or b :如果a为true,则返回a;否则返回b
下面我们举几个例子:
print(4 and 5)
print(nil and 13) --输出nil
print(false and 13) --输出false
print(4 or 5)
print(false or 5)
在lua中这是很有用的特性,也是比较令人混淆的特性。
我们可以模拟C语言中的语句:X =a?b:c ,在lua中,我们可以写成 x=a and b or c.
最有用的语句是:x = x or v ,它相当于:if not x then x=v end。
.运算符优先级,从低到高顺序如下:
or
and
< > <=>=~= ==
..(字符链接)
+ -
* / %
not # (lua5.1取长度运算)-(一元运算)
^
3.关键字
关键字是不能作为变量的。lua的关键字不多,就下面几个
and break doelse elseif
end false for function if
in localnil not or
repeat return thentrueuntil while
4,变量类型
怎么确定一个变量是什么类型呢?大家可以使用type()函数来检查。lua支持的类型有一下几种:
Nil 空值,所有没有使用过的变量,都是nil。nil即是值,又是类型
Boolean 布尔值,只有两个有效值:TRUE和false
Number
String 字符串,如果你愿意的话,字符串可以包含"\0"字符的(这和C语言总是以"\0"结尾是不一样的)
Table 关系表类型,这个功能比较强大,请参考后面的内容。
Function 函数类型,不要怀疑,函数也是一种类型,也就是说,所有的函数,它本身都是一种类型
UserData
常用的有Struct和指针。
Thread 线程类型。在lua中没有真正的线程,lua可以将一个函数分成几部分运行。如果感兴趣的话。可以去看看lua的文档。也跟遍历函数有点相似。
如:
function range(n)
local i = 0
while(i<n) do
coroutine.yield(i)
i=i+1;
end
end
5.变量的定义
所有的语言,都用到变量。在lua中,不管在什么地方,都不需要声明,并且所有的这些变量总是全局变量,除非我们在前面加上"local"。这点要特别注意。因为我们可能
想在函数中使用局部函数,却忘了用local来说明。
至于变量的名字,他是大小写相关的。也就是说,A和a是两个不同的变量。
定义一个变量的方法就是赋值。“=”操作就是用来赋值的
我们一起来定义几种常用类型的变量吧。
A. Nil
正如前面所说的,没有使用过的变量的值,都是Nil。有时候我们也需要将一个变量清除,这时候,我们可以直接给变量赋值nil值。如:
var 1= nil --请注意 nil 一定要小写
B.Boolean
布尔值通常是用在进行条件判断的时候。布尔值有两种true和false .在lua中,只有false和nil才被计算为FALSE,而所有任何其他类型的值,都是true,比如o,空字符串
等。都是true。不要被C语言的习惯所误导,0在lua中的确是true,你也可以直接给一个变量赋以Boolean类型的变量,如:
theBoolean = true
C.Number
在lua中,是没有整数类型的,也不需要,一般情况下,只要数值不是很大(比如不超过100.000.000.000.000),是不会产生误差的,在windowsxp能跑的当今主流PC上,
实数的运算并不比整数慢。
实数的表示方法,同C语言类似,如:
4 0.4 4.57e-3 0.3e12 5e+20
D.String
字符串,总是一种非常常用的高级类型。在lua中,我们可以非常方便的定义很长很长的字符串。
字符串在lua中有几种方法来表示,最常用的方法,是用双引号或单引号来扩起一个字符串的,如:"That's go!"或 "hello world"
和C语言相同的,它支持一些转义字符,列表如下:
\a bell
\b back space
\f form feed
\n carriage return
\t horizontal
\v vertical
\\ backslash
\"double quote
\"single quote
\"left square bracket
\"right square bracjet
由于这种字符串只能卸载一行中,因此,不可避免的要用到转译字符。加入转译字符的串,看起来是在是不敢恭维
E. Table
关系表类型,这是一种很强大的类型。我们可以把这个类型看做是一个数组,只是C语言的数组,只能用正整数来做索引;在lua中,你可以用任意类型来做数组的索引,
除了nil,同样,在c语言中,数组的内容只允许一种类型;在lua中,你也可以用任意类型的值来做数组的内容,除了nil.
Tabel 的定义很简单,它的主要特征是用{"和"}来括号一系列数据元素的,比如:
这一句话相当于
当表的索引是字符串的时候,我们可以简写成:
T1.john.age =27
或
这是一个很强的特性
在定义标的时候,我们可以把所有的数据内容一起写在"{"和"}"之间,这样子是非常方便,而且很好看。比如,前面的T1的定义,我们可以这么写:
T1=
在此我们需要提醒几点:
一:所有元素之间,总是用逗号","隔开
二:所有索引值需要用["和"]括起来;如果是字符串。还可以去掉引号和中括号;
三:如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;
表类型的构造是如此的方便,以至常常被人用来代替配置文件。是的,不用怀疑,它比ini文件要漂亮,并且要强大很多
F.Function 函数,
在lua中,函数的定义也很简单,典型的定义如下:
function add(a,b) --add是函数名字,a和b是参数名称
return a+b --return 用来返回函数的运行结果
end
请注意,return 语言一定要写在end之前,假如我们非要在中间放上一句return,那么就应该写成: do return end
还记得前面说过,函数也是变量类型吗?上面的函数定义,其实相当于:
add= function(a,b) return a+b end
当重新给add赋值时,它就不再表示这个函数了。我们甚至可以赋值给add任意数据,包括nil(这样,赋值为nil,将会把变量清除)。function 是不是很象C语言的函数指针?
function sum(a,b...)
如果想取得...所代表的参数,可以在函数中访问arg局部变量(表类型)得到(lua5.1: 取消arg,并直接用"..."来代表可变参数了,本质还是arg)。
如 sum(1,2,3,4)
则,在函数中,a = 1, b = 2, arg = {3, 4} (lua5.1: a = 1, b = 2, ... = {3, 4})
更可贵的是,它可以同时返回多个结果,比如:
function s()
return 1,2,3,4
end
a,b,c,d = s() -- 此时,a = 1, b = 2, c = 3, d = 4
前面说过,表类型可以拥有任意类型的值,包括函数!因此,有一个很强大的特性是,拥有函数的表,哦,我想更恰当的应该说是对象吧。
Lua可以使用面向对象编程了。不信?举例如下:
t =
{
Age = 27
add = function(self, n) self.Age = self.Age+n end
}
print(t.Age) -- 27
t.add(t, 10)
print(t.Age) -- 37
不过,t.add(t,10) 这一句实在是有点土对吧?没关系,在Lua中,我们可以简写成:
t:add(10) -- 相当于 t.add(t,10)
G. Userdata 和 Thread
这两个类型的话题,超出了本文的内容,就不打算细说了。
以上就是整个lua脚本基本语法部分!