lua语言和其他编程语言在语法上面大同小异,本文将会一一介绍lua语言的语法。
命名:lua中的命名规范与其他编程语言一样,可以是任何非数字开头的字母、数字、下划线组成的字符串。在lua中也有一些关键字是保留的,不能作
为名字使用:
and、break、do、else、elseif、end、false、for、function、if、in、local、nil、not、or、repeat、return、then、true、until、while
lua中对大小写也是敏感的:如and是一个保留字,但是And和AND则是两个合法的名字。一般约定以下划线开头链接一串大写字母的名字被保留用于lua
内部全局变量。
字符串:下面还有一些其他的标识符:
+ - * / % ^ # == ~= <= >= < > = ( ) { } [ ] ; : ' . .. ...
字符串可以用一对单引号引起,也可以用一对双引号引起,例:'helloWorld' 和 "helloWorld"均表示字符串,在lua中同样也包含类似C中的转义字符,如
下:
'\a
' (响铃), '\b
' (退格), '\f
' (表单), '\n
' (换行), '\r
' (回车), '\t
' (横向制表), '\v
' (纵向制表), '\\
' (反斜杠), '\"
' (双引号), 以及 '\'
' (单引号)
我们可以用反斜杠加数字的形式来描述一个字符,如\ddd,表示一串最多三位的十进制数字。注意,如果需要在这种描述方法后面接一个数字的字符,
那么反斜杠后面必须写满三个数字。lua中的字符串可以包含任何8位的值。包括用'\0'表示的零。只有在需要把引号、换行、反斜杠、零结束符引入字
符串中时,才需要使用转义符,其他字符可直接引入文本里。一些控制符可能会引起文件系统造成某些问题,但不会引起lua的任何问题。字符串还可
以用两个方括号括起来的方式定义,如[[helloWorld]],打印结果为helloWorld。我们也可以在两个方括号中间添加n个等号来表示等级,如0级方括号
为[[,1级方括号为[=[,以此类推。此处要注意的是两个方括号间的等号个数要左右对称,例如,[=====[helloWorld]=====]这种为正确的写法,
[=====[helloWorld]==]这种为错误的写法。一个长字符串可以由任何一级方括号开始,而由第一个遇到同级相反的方括号结束。整个词法分析过程中
不受分行限制,不处理任何转义符,并忽略掉任何不同等级的方括号。
数字:数字常量可以分两部分,十进制底数部分和十进制指数部分。指数部分是可选的。lua也支持十六进制整数常量,只需要在前面加上前缀0x,
lua中不支持八进制和二进制常量。下面列举出一些合法的数字常量的例子:
3、3.0、3.1415、314.16e-2 、0.31415E1、0xff 、0x56
注释:在lua中,使用两个减号(--)代表注释,如果在一对方括号前面加上--,则是屏蔽方括号内所有内容,即整个代码块。
值与类型:lua是一种动态类型的语言,这以为着变量没有类型,只有值才有类型。例如,我们在C中我们定义一个整型变量时,int a; 但是在lua中,
则没有这样的定义,它没有具体的类型,local a = 10; 只有在给a赋值才确定a的类型。
local a = 10;和 local a = "10";有什么区别呢?在这里前者给a赋值为数字10,此时a为number类型;后者给a赋值为字符串"10",此时a为string类
型。在lua中共有八种基本类型:nil,boolean,number,string,function,userdata,thread,table。
nil类型只有一种值nil,通常描述一个无意义的值时会使用。
boolean类型有两种值:true和false。除nil和false以外的所有值被当做真。
number表示实数(双精度浮点数)。
string表示一串字符集,字符串可以包含任何8位字符,包括零结束符('\0')。
lua可以调用和处理用lua写的函数以及用C写的函数。
userdata类型用来将任意C数据保存在lua变量中。这个类型相当于一块原生的内存,除了赋值和相同性判断,lua没有为之预定义任何操作。然而,通
过使用metatable(元表),可以为userdata自定义一组操作。userdata不能再lua中创建出来,也不能在lua中修改。这样的操作值能通过C API。这
一点保证了宿主程序完全掌管其中的数据。
thread类型用来区别独立的执行线程,它被用来实现coroutine(协同例程)。不要把lua 线程跟操作系统的线程搞混。lua可以在所有的系统上提供对
coroutine的支持,即使系统并不支持线程。
table类型实现了一个关联数组。也就是说,数组可以用任何东西(除nil)做索引,而不限于数字。table可以以不同类型的值构成,它可以包含所有类
型的值(除nil)。table是lua中唯一的数据结构;它可以用来描述字典、数组、符号表、集合、记录、图、树等等。用于表述记录时,lua使用域名作为
索引。语言本身采用一种语法糖,支持以a.name的形式表示a["name"]。有很多形式用于在lua中创建一个table。跟索引一样,table每个域中的值可
以是任何类型(除nil)。特别的,因为函数本身也是值,所以table的域中可以放函数。这样table中就可以有一些methods了。table,function,
thread,userdata这些类型的值是所谓的对象;变量本身并不真正的存放他们的值,而只是放了一个对对象的引用。赋值,参数传递,函数返回,都是
对这些对象的引用进行操作;这些操作不会在暗地里做任何性质的拷贝。库函数type可以返回一个描述给定值的类型的字符串。
以上是对lua中数据类型做了简单的介绍,如果必要,会在后续的文章中会做详细的解释。
强制转换:lua提供运行时字符串到数字的自动转换。任何对字符串的数学运算操作都会尝试用一般的转换规则把这个字符串转换成一个数字。相反,
无论何时,一个数字需要作为字符串来使用时,数字都会以合理的格式转换为字符串。需要完全控制数字怎样转换为字符串,可以使用字符串库中
format函数
例如:print("10" + 5) --> 15 编译时,字符串"10"自动转换为数字10
本文参考lua手册 http://www.lua.org/manual/5.3/manual.html