最高指挥官的mod语言 lua的简介

有很多朋友都在询问lua的东西,lua其实是相当简单的,类似于非常简单的方程式,我把自己学习lua的笔记摘抄出来分享给大家,希望可以在起步阶段做一个入门性质的帮助。
因为是笔记,所以不是循环渐进性质的介绍,同时我在平时对于lua的需要也只是看懂ta3d的AI脚本等,以及lua和可执行文件互相结合的部分,所以做的笔记可能比较不使用,但最好的优点是在我这段笔记相当简单,而且也是清晰又准确的,适合入门时当做试验的理论来用。也推荐一位trow的朋友写的lua教程,也是他的教程让我对lua有了一个基础的认识的,感谢这样朋友浅显又带有实例的介绍:
http://trow.cc/forum/index.php?showtopic=22233

在需要测试每个lua 运算符和语句的写法时,可以到lua的网站的在线执行地址来测试,
http://www.lua.org/demo.html
因为这儿的返回值是直接被当做显示出来的数据,可以把要测试的表达式写成


=100+ 100;

显示出来的返回值就是200,类似的要测试某个函数的返回值是什么样的时候,只要这样就得到了要知道的实质性的函数返回值的样子


=function ( argc0, argc1, ....argcN);

我的笔记:
lua中的比较运算符有==以外,还有>(大于),<(小于),~=(不等于)以及<=和>=,注意区别~=的不同
Lua语言具有动态变量的特点,也就是说在使用一个变量的时候,不需要事先声明它的类型。
需要注意的是,换行符就代表一个语句的结束,也可以用;来表示出来语句的结束来把多行写在一行。
Lua里直接可以把函数抽象的当做一种变量来使用,而不需要函数指针这种模仿处理器方式的间接产物。
Lua中,函数名也是变量名,所以有一个需要注意的地方:如果给函数包括系统函数,比如print,赋予一个值,那么它就不再是一个函数了。这样做有一个好处:程序员可以很方便地重构系统函数,比如sys_print=print print=myprint。但是缺点就是必须得小心的敲打变量名,因为没有声明的过程,使用时会不小心覆盖掉原来的变量或者声明出全新的变量(但这个当然会提示)。
为了可复用性,也就是其他程序员可以直接利用你的代码。函数中的变量应该全都是局部变量,局部变量要在其第一次出现,定义时在其先用local显示的声明,local只能出现在一个语句的开始部分来定义第一个变量是局部变量。
函数的语法是
function name (parm1, parm2, …)

end
函数可以返回多个值,之间用",“隔开就可以了,接受这个函数的返回值时,=之前的也要是”,"隔开的多个变量。

表是Lua的灵魂,是当中最灵活,最多变(也就是最复杂)的部分。
a={}; 这样就声明了一个表。表的作用是,在当中储存许多个变量
在lua以外的几乎所有语言中,数字下标都是从0开始的,这是因为内存地址的分配方式(也许)。总之还是从1开始比较符合人类习惯。而在一些面向对象语言当中,bx.status这种变量,叫做bx对象的属性。
接下来是比较复杂的bx:totalfinger()用冒号调用一个函数,意思是把自己作为第一个变量传递给函数,也就是说这个写法其实和
bx.totalfinger(bx)是一个意思。通常lua中的表中包含的函数,会处理一个self的默认参数,这就类似于c语法中的this

if else的语法是:
if a==nil
then
print(“NIL!”)
else
print(a)
end
当a没有值的时候,一个最新定义的它就是默认的nil。
在lua中,nil和false都当作条件不成立。其他都当作条件成立,但是在lua里面false==nil返回的是false
还有对应的while…do…end和repeat…until…,可以利用 break 语句在其中跳出循环。
for的语法相当不同,for variable = from_exp , to_exp [, step_exp] do block end
c中是用";“作为for的子语句的区分的,lua是用”,“,但lua中不是一定要把每个子语句和其”,"都写出来的。
for在lua中有遍历iterator的功能,利用默认的pairs ()和ipairs ()以表明作为参数时分布可以返回默认的索引和值二个返回值,按照数字排序的索引和值二个返回值,因为是二个返回值,所以格式要写如下:
test_table=
{
bx=“早餐”,
jox=“午餐”
}
for i,j in pairs(test_table) do
print(i…“没吃”…j)
end

出来的结果是
bx没吃早餐
jox没吃午餐

另外还有一个函数next(table [,index])可以枚举iterator用。next的返回值也是二个。

lua对字符串操作的扩充是很有用的
主要的是连字符"…",它的作用也很简单:将前后两个变量连接成一个新的字符串。
还有就是string这个lua库支持的表(lua的类),里面包含了大量对字符串有用的操作。
string.byte ( s [, i [, j]])或者s:byte ( [, i [, j]])可以按照byte(字符的字节)形式获得指定index位置的字符的值,对应的有string.char ( i1, i2, …)来把i1, i2转换成对应的字符
string.dump(function),可以把用lua所写的(而非lua_register之类加进来的外部扩充)函数的语句保存到它的返回值里。
string.find(s, pattern [, init [, plain]])或者另一个用法s:find(pattern [, init [, plain]])可以查找一个字符串在s的位置,plain指定查找的开始位置,默认为1。
string.format ( s, e1, e2, …)和s:format ( e1, e2, …)是格式化字符串, s被当做格式,而返回值则是格式化好的字符串。
以%开头的字符就是format字符串的组成部分,包含c, d, E, e, f, g, G, i, o, u, X, 和x,要对应数字类型的变量,q 和 s 对应一个字符串类型的变量

= string.format(“%s %q”, “Hello”, “Lua user!”) – string and quoted string
Hello “Lua user!”
= string.format(“%c%c%c”, 76,117,97) – char
Lua
= string.format(“%e, %E”, math.pi,math.pi) – exponent
3.141593e+000, 3.141593E+000
= string.format(“%f, %g”, math.pi,math.pi) – float and compact float
3.141593, 3.14159
= string.format(“%d, %i, %u”, -100,-100,-100) – signed, signed, unsigned integer
-100, -100, 4294967196
= string.format(“%o, %x, %X”, -100,-100,-100) – octal, hex, hex
37777777634, ffffff9c, FFFFFF9C

string.gmatch(s, pat)和s:gmatch(pat)可以从s中匹配pat出来
特别注意lua库支持的字符串匹配,这儿的pat可以是format字符串里的%?的格式化字符
还可以在一个字符后面带上*, +, - 或?.来表示特殊的匹配数量。代表其前的字符串匹配0个或者更多个。+代表至少一个或更多个。-和的匹配方式相同,但匹配出来的字符串会是尽可能显示的短的,意味着要是可以只匹配第一个字符的话,就会只显示第一个字符。?,则匹配0个或1个。
当需要匹配一个特定单词时,可以用 w…这样的格式,代表匹配一个w开头的单词。
另外,还有一个特殊的组合,[xyjkn]可以出现在pat中,这个格式代表匹配xyjkn中的任一个。'[j-q]'则匹配j-q之间的字符。其中还可以使用%d的格式化字符,但有一个特殊的字符"^",它出现在pat代表着其后的东西都不愿意被匹配到,可以是[j-q],也可以是[%d],或者普通的字符,但其前的任一个仍可被匹配到。

最后,lua中的一行的注释是用"–"来开始的,就像sql语言一样。

http://www.supremecommanderhq.com/tutorials.php
lua还有一个英文的最高玩家写的教材,也很贴切。是lua和c++互相结合,以及c++开发游戏的一些简介。