在这首诗中,我想向我们如是说怎样展开 Lua 流程设计。我假定我们都段小宇最少两门编程词汇,比如说 Basic 或 C,不光是 C。因为Lua 的最小商业用途是在寄主流程中做为JAVA采用的。
Lua 的句法较为简单,自学出来也较为省心,但机能却并不弱,在 Lua 中,在我看来表达式,除URL。请读懂这句话。
标识符注解
写三个流程,常常免不了注解的,在 Lua 中,你能采用单行线注解和二百一十三注解。
单行线注解中,已连续三个破折号”–“则表示注解的已经开始,始终沿袭到行末年末。相等于 C++词汇中的”//”。二百一十三注解中,由”–[[“则表示注解已经开始,因此始终沿袭到”]]”年末。此种注解相等于 C 词汇中的”/*…*/”。在注解当中,”[[“和 “]]”是能冗余的。
基本上句法
经典之作的”Hello world”的流程常常被用以已经开始如是说一类词汇。在 Lua 中,写三个这种的流程很单纯:
print(“Hello world”)
在 Lua 中,句子间能用王劝”;”分隔,也能用盲点分隔。一般而言,假如数个句子写在同一个行不然,提议常常用王劝分隔。Lua 有许多种流程掌控句子,如:
前提掌控:if 前提 then … elseif 条件 then … else … endWhile 循环式:while 前提 do … endRepeat 循环式:repeat … until 前提For 循环式:for 表达式= 消费者物价指数,起点值,TNUMBERFK do … endFor 循环式:for 表达式1,表达式2,…,表达式 N in 表或隐式表达式 do … end
不光注意呵呵,for 的循环式表达式常常只促进作用于 for 的局部表达式,你也能略去TNUMBERFK值,这时,for 循环式会采用1做为TNUMBERFK值。你能用 break 来终止三个循环式。
假如你有流程设计的此基础,比如说你段小宇 Basic,C 等等的,你会真的 Lua 也不难。但 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 a string”
较为运算
<><=>===~=
分别则表示小于,大于,不大于,不小于,相等,不相等,所有这些操作符常常返回true 或false。
对于Table,Function 和Userdata 类型的数据,只有==和~=能用。
相等则表示三个表达式引用的是同三个数据。比如说:
a={1,2}b=aprint(a==b, a~=b)– true, falsea={1,2}b={1,2}print(a==b, a~=b)– false, true
逻辑运算
and, or, not
其中,and 和or 与C 词汇区别不光大。在这里,请先读懂,在Lua 中,只有false 和nil 才计算为false,其它任何数据都计算为true,0也是true!
and 和or 的运算结果不是true 和false,而是和它的三个操作数相关。
a and b:假如a 为false,则返回a;否则返回ba or b:假如a 为true,则返回a;否则返回b
举几个例子:
print(4 and 5)–>5print(nil and 13)–> nilprint(false and 13)–> falseprint(4 or 5)–>4print(false or 5)–>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 。
运算符优先级
运算符优先级,从高到低顺序如下:
^not -(一元运算)*/+-..(字符串连接)<><=>=~===andor
URL
URL是不能做为表达式的。Lua 的URL不多,就以下几个:
and break do else elseif end false for function ifin local nil not or repeat return then true until while
表达式类型
怎么确定三个表达式是什么类型的呢?我们能用type()表达式来检查。Lua支持的类型有以下几种:
Nil 空值,所有没有采用过的表达式,都是nil。nil 既是值,又是类型。Boolean 布尔值Number 数值,在Lua 里,数值相等于C 词汇的doubleString 字符串,假如你愿意不然,字符串是能包含\0字符的Table 关系表类型,这个类型机能较为强大,我们在后面慢慢说。Function 表达式类型,不要怀疑,表达式也是一类类型,也就是说,所有的表达式,它本身就是三个表达式。Userdata 这个类型专门用以和Lua 的寄主打交道的。寄主通常是用C和C++来编写的,在此种情况下,Userdata 能是寄主的任意数据类型,常用的有Struct 和指针。Thread 线程类型,在Lua 中没有真正的线程。Lua 中能将三个表达式分成几部份运行。假如感兴趣不然,能去看看Lua 的文档。
表达式的定义
所有的词汇,都要用到表达式。在 Lua 中,不管你在什么地方采用表达式,都不需要声明,因此所有的这些表达式常常全局变量,除非,你在前面加上”local”。
这一点要不光不光注意,因为你可能想在表达式里采用局部表达式,却忘了用local来说明。
至于表达式名字,它是大小写相关的。也就是说,A 和a 是三个不同的表达式。
定义三个表达式的方法就是赋值。”=”操作就是用以赋值的,我们一出来定义几种常用类型的表达式吧。
A. Nil
正如前面所说的,没有采用过的表达式的值,都是Nil。有时候我们也需要将三个表达式清除,这时,我们能直接给表达式赋以nil 值。如:
var1=nil –请不光注意nil 一定要小写
B. Boolean
布尔值通常是用在展开前提判断的时候。布尔值有两种:true 和false。在Lua 中,只有false 和nil 才被计算为false,而所有任何其它类型的值,都是true。比如说0,空串等等,都是true。
不要被C 词汇的习惯所误导,0在Lua 中的的确确是true。你也能直接给三个表达式赋以Boolean 类型的值,如:
varboolean = true
C. Number
在Lua 中,是没有整数类型的,也不需要。一般情况下,只要数值不是很大(比如说不超过100,000,000,000,000),是不会产生舍入误差的。在很多CPU上,实数的运算并不比整数慢。
实数的则表示方法,同C 词汇类似,如:
40.44.57e-30.3e125e+20
D. String
字符串,常常一类非常常用的高级类型。在Lua 中,你能非常方便的定义很长很长的字符串。字符串在Lua 中有几种方法来则表示,最通用的方法,是用双引号或单引号来括起三个字符串的,如:
“This is a string.”
和C 词汇相同的,它支持一些转义字符,列表如下:
\a bell\b back space\f form feed\n newline\r carriage return\t horizontal tab\v vertical tab\\ backslash\” double quote\ single quote\[ left square bracket\] right square bracket
由于此种字符串只能写在一行中,因此,不可避免的要用到转义字符。加入了转义字符的串,看出来实在是不敢恭维,比如说:
“one line\nnext line\n\”in quotes\”,in quotes”
一大堆的”\”符号让人看出来很倒胃口。假如你与我有同感,那么,我们在Lua 中,能用另一类则表示方法:用”[[“和”]]”将二百一十三的字符串括出来,如:
page =[[An HTML PageLua[[a text between double brackets]]]]
值得不光注意的是,在此种字符串中,假如含有单独采用的”[[“或”]]”就仍然得用”\[“或”\]”来避免歧义。当然,此种情况是极少会发生的。
E. Table
关系表类型,这是三个很强大的类型。我们能把这个类型看作是三个数组。只是C 词汇的数组,只能用正整数来作索引;在Lua 中,你能用任意类型来作数组的索引,除nil。同样,在C 词汇中,数组的内容只允许一类类型;在Lua 中,你也能用任意类型的值来作数组的内容,除nil。
Table 的定义很单纯,它的主要特征是用”{“和”}”来括起一系列数据元素的。比如说:
T1= {}–定义三个空表T1[1]=10–然后我们就能象C 词汇一样来采用它了。T1[“John”]={Age=27, Gender=”Male”}
这一句相等于:
T1[“John”]={}–必须先定义成三个表,还记得未定义的表达式是nil类型吗T1[“John”][“Age”]=27T1[“John”][“Gender”]=”Male”
当表的索引是字符串的时候,我们能简写成:
T1.John={}T1.John.Age=27T1.John.Gender=”Male”
或
T1.John{Age=27, Gender=”Male”}
这是三个很强的特性。
在定义表的时候,我们能把所有的数据内容一起写在”{“和”}”间,这种子是非常方便,而且很好看。比如说,前面的T1的定义,我们能这么写:
T1={10,–相等于[1]= 10[100]= 40,John=–假如你原意,你还能写成:[“John”]={Age=27,–假如你原意,你还可以写成:[“Age”]=27Gender=Male –假如你原意,你还能写成:[“Gender”]=Male},20–相等于[2]= 20}
看出来很漂亮,我们在写的时候,需要不光注意三点:
所有元素之间,常常用逗号”,”分隔;所有索引值都需要用”[“和”]”括出来;假如是字符串,还能去掉引号和中括号;假如不写索引,则索引就会被认为是数字,并按顺序自动从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 (这种,你就清除add 表达式)。Function 是不是很象C 词汇的表达式指针。
和C 词汇一样,Lua 的表达式能接受可变参数个数,它同样是用”…”来定义的,比如说:
function sum (a,b,…)
假如想取得…所代表的参数,能在表达式中访问arg 局部表达式(表类型)得到。
如sum(1,2,3,4)则,在表达式中,a =1, b =2, arg ={3,4}更可贵的是,它能同时返回数个结果,比如说:
function s()return 1,2,3,4enda,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)–27t.add(t,10)print(t.Age)–37
不过,t.add(t,10)这一句实在是有点土对,没关系,在Lua 中,你能简写成:
t:add(10)–相等于t.add(t,10)
G. Userdata 和Thread
这三个类型不然题,超出了本文的内容,就不打算细说了。
结束语
接下来,需要用 Lua 解释器,来帮助你理解和实践了。这篇小文只是帮助你大体了解 Lua 的句法。假如你有编程此基础,相信会很快对 Lua 上手了。
就象C 词汇一样,Lua 提供了相当多的标准表达式来增强词汇的机能。采用这些标准表达式,你能很方便的操作各种数据类型,并处理输入输出。有关这方面的信息,你能参考《Programming in Lua 》一书,你能在网络上直接观看电子版,网址为:http://www.lua.org/pil/index.html。