词法规范
1. 控制台打印 cclog() print() 2. 命名规则:
字母数字下划线3个元素组合,不能以数字开头,下面这些命名都是合法的 i, j, i10, _ij, aSomewhatLongName, _INPUT
注意最后一个_INPUT,在Lua中要尽量避免使用以下划线\"_\"开头,后面跟大写字母的命名,因为这些通常会作为保留字有特殊用途。
Lua是大小写敏感的,例如name与Name就绝对是不等的。 Lua保留字列表
and break do else elseif end false for function if in local nil not or repeat return then true until while 3注释:
单行注释:-- 开始到行尾
多行注释:--[[开始,到 ]] 结束。 多行注释掉妙用 --[[
Statements......//注释 --]]
在需要打开整个注释掉时候,可以简单地在第一行前加一个“-”就可以了,这样标识注释起始和结束位置的行就分别变成了单行注释,如下 ---[[
Statements.......//可用 --]]
全局变量
2类型与值
Lua是一个动态类型的语言,没有类型定义,每个值都有自己的类型。 Lua有8个基本类型,
Nil:Nil类型只有一个值,nil,跟其他任何值都不同。如我们之前看到的,在一个全局变量未被赋值之前,它的值为nil,你也可以通过将一个全局变量赋值为nil来删除它。Lua用nil作为一个无值类型,表示一个变量不再起作用
Boolean :Boolean类型含有两个值,true和false。但是Lua中可以表示条件的变量不仅仅boolean类型,任何值都可以表示条件。Lua认为false和nil为\"假\",其他任何值都是\"真\"。注意,跟其他语言不同的是,Lua认为0和空字符串为\"真
Number :Number类型代表实数(在计算机中占两个地址的浮点数)。Lua没有整型,并且也不需要。
String :String在Lua中与其他编程语言没有什么不同,都是表示一串字符。但是Lua可以在字符串中含有任何字符,包括0.
String在Lua中不可被更改,是常量。你不能更改一个字符串中的某一个字符,但是可以创建一个新的string。例如
c = \"Hello Word\" d = \"Hello Lua\"
Lua提供了string和number的运行时自动转换。任何对string进行的算术操作,都会尝试将string转换为number
print(\"10100\" + 1); 输出 10101
除了算术操作,其他任何期待一个number的地方,如果传入string,都是尝试将string转换为number。相反,在一个期待string的地方,如果传入number,那么也会尝试将number转换为string。
将number转换为string,可以用函数tostring。另外,可以用“#”来取得一个string的长度。
Function :Function在lua中是属于first-class值,可以存储到变量中,可以作为参数传递给其他的function,可以作为function的result来return。
Lua中,可以调用用lua或C语言实现的函数。Lua本身就是用C实现的。它实现了string,table,io,math,debug等基本的库,程序可以自己定义其他的函数来扩展功能。
Table : 用过都知道,它的index不仅可以使用number,还能使用string等其他的值,nil除外。table没有固定的size,你可以动态地向table中添加元素。table是Lua中的主要数据结构。在Lua中,我们用table来表示普通数组,符号表,set,record,queue和其他的lua数据结构。Lua也使用table来表示module,package和其他的对象。当我们写io.read时,我们的意思是“io模块的read函数”,对Lua来说,它理解为“从名为io的table中以‘read’为key进行索引”
Lua中,table既不是“值”也不是“变量”,而是“对象”。就类似于Java中的数字或者Map。Table是通过“构造表达式”完成的,最简单的构造表达式就是{}
table总是匿名的。table本身和存储table的变量,二者之间没有固定的联系:
当程序里变量不再引用一个table的时候,Lua的垃圾收集器会删除这个table并重用它的内存。
同一个table中可以存储不同index类型的值,并且table的大小可以动态增长 像全局变量一样,如果table中未初始化的field值为nil,可以通过赋值nil的方式来删除一个table
Lua中使用record方式来索引值,a.name这种格式,相当于a[\"name\"]
注意,a.x==a[\"x\"] != a[x]
Lua的table的index值从1开始,不是从0
Lua的size运算符'#'的用法,它是以table中第一个值为nil的位置为end的,就像C语言的string是以'\\0'为end一样,所以,用'#'的话,table中就不能有hole(值为nil的)
Userdata :自定义类型 Thread :线程
利用type函数可以打印出一个给定值的类型。
3表达式
1.算术操作符:
Lua支持常规的算术运算符:'+', '-', '*', '/', '^', '%'(取模), '-'(负)。所有这些运算符都对实数起作用。举个例子,x^0.5, 计算x的平方根, x^(-1/3),计算x的立方根的反数
2.关系操作符
Lua提供了如下关系操作符:
< > <= >= == ~= (不等于) 我们把<, >, <=, >=称为order operator。
order operator只能应用于数值和字符串。Lua根据字母表顺序来比较字符串的大小,字母表的顺序由本地设置决定。非数值和字符串的值只能比较相等或者不相等,不能用于order operator。
所有这些操作符产生的结果都是true或者false
'=='检查是否相等,'~='检查是否不等。这两个操作符可以作用于任意的两个值。如果要比较的两个值是不同的类型,那么Lua认为它们是不等的。否则,Lua根据它们的类型来比较它们是否相等。特例,nil只等于它本身。
3.逻辑运算符
逻辑运算符有:and, or, not。跟控制结构(if,while等)类似,所有的逻辑操作符把false和nil认为是false,其他的任意值都为true。(包括0) and:如果第一个参数为false,返回第一个参数,否则返回第二个参数。(同为true才为true) or :如果第一个参数为false,返回第二个参数,否则返回第一个参数。 (同为false才 为false)
and
与Java中的短语路与相似,当地一个能确定整个表达式的结果时,就不会再去计算第二个表达式 or
'not'操作符总是返回true或者false
4.连接操作符
Lua用'..'(两个点)来表示string连接符。如果它的任一个操作数为数字,Lua会把它转为string
Lua中的string是常量。string连接操作符会创建一个新的string,不会对它的操作数有任何修改:
5.优先级
Lua中的操作符优先级,如下表所示,从高到低
6.表构造函数
构造函数是一个用来初始化表(table)的表达式。它是Lua的一个独特特性和很强大的功能之一。
最简单的构造函数是空构造函数,{},创建一个空table。构造函数也可以初始化数组,例如:
将num[1]初始化为\"one\", num[2]为\"two\",注意,index是从1开始
显式指定构造函数index从0开始;但是不推荐这样创建table,可能会导致很多库不能用。
4 . 语句 1. 赋值
赋值是改变一个变量的值或者table的域的最基本的方法:
2. 局部变量和代码块
除了全局变量,Lua也支持局部变量。可以用local来创建局部变量
跟全局变量不同,局部变量有作用域,只在它被声明的域内有效。代码块可以是一个控制结构,一个函数,或者代码块(变量声明的文件或者代码块)
尽可能的使用局部变量,是一个好的编程方式。局部变量可以使你避免用很多多余的全局变量名字导致的程序混乱。除此之外,局部变量的访问速度要比全局变量快。还有,局部
变量在超出作用域后会自动失效,垃圾收集器会释放掉它占用的空间。
因为很多语句强制要求所有的局部变量都必须在一个块的开始处进行声明,一些人会认为在代码块中间进行局部变量声明不是好的编程风格。但是,恰恰相反:当你要用的时候再声明它,你总是会附带一个初始化的赋值语句(这样你就很少会忘记变量初始化)。除此之外,也可以缩小变量的作用域,增强代码可读性。
3.控制结构
Lua提供了一些传统的控制结构,if条件执行,while, repeat 和 for 迭代执行。所有的控制结构都有一个显式的结束符:end是if, for, while的结束符;until是repeat结构的结束符。
控制语句的条件表达式可能是任意值,Lua将false和nil看作是false,其他所有值都是true。
if then else
if语句检查它的条件表达式,根据结果来执行then-part或者else-part。else-part是可选的。
while
while检查条件表达式,如果条件为false,那么循环停止;否则,Lua运行循环体。然后重复这个过程。
repeat
从名字就可以看出,repeat-until语句会执行它的循环体,直到它的条件表达式为true。条件表达式实在循环体之后才检查,因此,循环体至少会被运行一次。
循环
在Lua中,for循环有两种形式,数字型for(numeric for) 和 泛型for(generic for)
数字型 for的语法如下:
泛型 for循环从一个迭代函数中遍历所有的值
范型 for 和数值 for 有两点相同: 1. 控制变量是局部变量 2. 不要修改控制变量的值
从表面上看很简单,但是generic for是比表面上看更强大的。使用合适的迭代器,我们可以遍历几乎任何东西。基础库提供了几个迭代器,迭代文件的行(io.lines),table的key-value对(pairs),数组中的条目(ipairs),string中的字符(string.gmatch),等等。当然,我们也可以自己写迭代器。
break和return语句可以使程序跳出循环
我们用break语句结束一个循环,结束包含它的最内层的循环,这个跟C是类似的。不能在循环体外使用break。break后,程序继续从跳出的循环部分继续执行。
return语句从函数返回结果,或者简单地只是结束一个函数。在函数的末尾都有一个隐式的return,因此,如果函数正常结束,不返回任何值,就没必要显式地调用一次return。
第 5 章 函数
函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并 返回值,这种情况下函数作为赋值语句的表达式使用。
1.多返回值
不同于常规函数,Lua的函数可以返回多个返回值。一些Lua中预定义的函数可以返回多个返回值。例如string.find函数,在string中匹配一个sub-string,string.find返回sub-string的起始位置和结束位置。利用多赋值语句来获取函数的多个返回值。
1. 当调用作为表达式最后一个参数或者仅有一个参数时, 根据变量个数函数尽可能 多地返回多个值,不足补 nil,超出舍去。
第二,函数调用作为函数参数被调用时,和多值赋值是相同。
2可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。Lua 将函数的参数放在一个叫 arg 的表中,除了参数以外,arg 表中还有一个域 n 表示参数的个数。
因篇幅问题不能全部显示,请点此查看更多更全内容