lua

来源:互联网 发布:js urlencode 怎么使用 编辑:程序博客网 时间:2024/04/28 21:56

23:31 2012/12/21
                                                            lua 基础知识

1.lua可以自动将将十六进表示的数字转为十进制 例 >print(0x1) 输出1 >print(0xf) 输出15 >print(0x10) 输出16 >print(0x10a4) 输出4260 >print(2*0xF) 输出30
2.每一个标准的Lua系统中的数在内部都是用浮点数表示的
3.>x,y=3,5而不是>x=3,y=5
4.不等于的符号是~=而不是!= 
5.等价运算符(==和~=)可以用来比较任意类型的值,而<、>、<=、>=只能用来比较相同类型的值 并且< 和 >这一组运算符只在数值和字符串内部有意义

6.>print("nj">"nj0") 值为false  原因为前面的nj后没有字符而后面的还有字符

7.lua的字符串是不可以修改的,也就是除非完全新建一个字符串,否则它是不可以改变的。要连接两个字符串,使用连接符(..) 例如 x=you y=me 链接后为x..y
8.有时需要把数字转换为字符串,例如>print("abc"..0) 输出abc0 或者使用tostring()函数 例如>x=23 >ai=tostring(x) >print(type(ai)) 输出string
9.有时需要把字符串转换为数字,使用tonumber()函数 例如>x=tonumber("123")  >print(type(x)) 输出number >print(x)输出123
再如>x=tonumber("le3")  >print(type(x)) 输出number  >print(x)输出1000  这里字符串被转为数字

10.使用‘’、""来创建字符串但遇到下列情况需注意 >x='Isn't it nice?'将会输出错误消息expected near 'it',所以应该改为x='Isn\'t it nice?'
再如x="ilove you,"you too"" 同样错误,应该改为"i love you,\"you too"" 
原因为lua在这里发现了一个标识符(x),赋值运算符(=)和一个字符串(Isn't)和(ilove you,),Lua在大多数运算之间不需要任何空格,所以它马上开始表达上的下一部分,这
一部分以标识符t开始。下一个需要解释的内容是it标识符,解释器不知道要对它做什么。在这种情况下,可以推测您的赋值运算在这里出现了错误。

11.方括号([=[]=])其中(=)可以有0个或任意个,应用举例 >x=[[This is a long string,and I can inlude 'and"]] print(x)
输出This is a long string,and I can inlude 'and"
再如  >x[==[This is a long string,and I can inlude]],',and "]==]   >print(x) 输出This is a long string,and I can inlude]],',and "
您会发现自己并不会经常在字符串中使用到[[某个字符串]]这种格式,但这种引用方法在您想创建一个多行字符串或字符串中含有引号时确实很有用

12.求字符串的长度可用#运算符和string.len()函数 例如 >print(#"lua") 输出3 再如>x="program" >print(string.len(x)) 输出7

13.逻辑运算符"and" "or" "not"的用法 ⑴.当且仅当两个参数是true时,and运算符返回true;当任意一个操作数是false或不存在值的时候,它将返回false
例如>print(true and true) 输出true >print(false and true) 输出false  >print(true and 2) 输出2 >print(ture and "do") 输出do
>print(false and 2) 输出false    ⑵.只要两个操作数有一个为true,or运算符就返回true。但是or运算符比and运算符的优先级低
⑶.not运算符既是把布尔值转化为相反的另一个值  在lua中任何非false、nil的值都为true 例如>print(not nil) 输出true

14.组块(chunk)的解释:在lua的解析器中,您输入的每一行都是它本身的组块,除非您将其封装在一个组块中(如do...end快).因此下面的代码无效
>local i=18 >print(i) 输出nil 应该改为>do >>local i=10 >>print(i) >end 输出10   特别说明,在lua中除非特别指明,否则几乎所有的变量都是全局的
                                                  
                                                        基本的函数和控制结构

1.function可以用来创建新的函数,然后可以将其存放在一个变量中,或者直接调用.在lua解析器中基本函数的定义如下:>hello=function() >>print("Hello World!")
>>end.现在您可以直接输入hello()来调用这个新的函数不需要每次输入print("Hello World!").另外一种定义>local function hello() >>print("Hello World!") >>end

2.空参数:当被调函数有参数时而主调函数没有参数传入时,被调函数参数会获取一个nil值.但是一个nil的值不能作为算术表达式的一部分,或者主调的参数是非数值时
而被调的参数类型是数值型时也会发生错误.

3.在lua中每个函数只是一个简单的lua的值,它的类型是function.这些值可以被比较(使用"~="和"=="),绑定到变量名,传递给函数,从函数中返回,或者作为table中的关键字.
能以这样的方式对待的lua的值被称为头等对象,而支持这种方式的函数被称为头等函数.例如>hello=function() print("Hello World!") end 创建了一个hello函数.这个值可
通过lua值的比较方式进行比较,如 >print(hello==hello) 输出ture 再如>a=hello >print(a=hello) 输出ture 再如a=function() print("Hello World!") end >print
(a==hello) 输出false

4.if语句的格式:例如>function f(x) >>print("You input"...x) >>if(x==5) then >>print("You found the magic number!") >>end >>end.注意条件判断中如name
表示测试变量name是不是除false和nil之外的其他东西(如果不是条件极为真).函数error("错误")是一个表示出错信息的函数.

5.while/do语句的格式:>while(boolean expression) do >>body >>end ;  repeat/until语句的格式:>repeat >>body >>until(boolean expression)

6.for语句格式:>for i=1,5,i++ do >>body >>end 当没有给出i的增量的时候,lua默认是1,在for循环中,初始值和增量只在循环开始的时候计算一次,因此可以用变量和表达式
代替这些值.这些值不能在循环中被改变,它们都睡已经计算好了的.例如 >a=3 >for i=1,a do >>print(i) >>a=a+1 >>end 输出1,2,3这个例子没有死循环是由于循环条件只
求了一次.

7.①.for循环中的计数变量名的作用域被自动设置为局部的,也就是说它们在这一层外面不可以访问.例如>i=10 >for i=1,2 do print(i) end 输出1,2,3  >print(i)输出10
②.由于某些原因,您需保存控制变量的值,就可以在for循环前声明一个局部变量,这样就可以存放您所需的数字,例如>b=13 >do local v >for i=1,b do >v=i >end >print(v)
end 当循环结束时,v的值为13.

                                                                使用表

1.矩阵可以解释表在lua中是如何实现的.矩阵是成对元素的一个集合,每一对元素都有一个关键字和一个值.表可以使用一些关键字来索引,并且返回(或存储)给定的值.
2.创建表,例如 >tbl{} >tbl["name"]="A" >tbl["phone"]="5678" 这里用[]和[]中的关键值来访问这个表,然后>print(tbl["name"]) 输出A.lua可以使用除nil以外的任何值
作为关键词.例如>tbl[1]="hi" >tbl[2]="world" >>print(tbl[1])输出hi.

3.当表被未设定的关键词索引的时,表将返回nil.运行下面代码:>print(tbl["x"]) 输出nil.简单的说,对于给出的关键字表中什么也没用存储.可以利用这种方式来帮助我们从
表中清除不要的条目: >tbl[1]=nil
4.>tbl["address"]="China",可以使用>tbl.address="China" 这种快捷方式只有当关键字词以字母或下划线字符开头,并且只有字母、数字和下划线组成的字符串的时候才能
执行.此外关键词不能是lua中的保留关键词(如end).如>tbl{name="A",address="China",}或者>tbl{["name"]="A",["address"]="China",} 表中的","不能少.
5.把表当做数组使用:tbl{value1,value2,...} 或者tbl{[1]=value1,[2]=value2,...}数组是表的一部分,获取表的长度,如>tbl{"aa","bb",["cc"]="xx",["dd"]="yy","ee"
,} >print(#tbl)输出3,"#"只计算了数组中元素的个数.如>for i=1,#tbl do >>print(tbl[i]) >>end 输出aa bb cc

6.用名称空间使用表:table.insert();table.sort();table.remove()当函数以这种方式进行分组时,它们就是名称空间的一部分,在table.insert()中就是table名称空间.
名称空间提供了一种对相关函数的逻辑分组.因为表支持函数值,所以table.insert()可以用如下方式访问:table["insert"]()

7.向表中添加函数有两种方法,一种是索引表,并存储已有函数的值;另一种是直接把函数定义为名称空间的一部分. ①存储已有函数:首先新建一个空表 >tbl={},在定义一个函数
>function f(x) >return (x+2) >end 使用下面的语句即可实现第一种功能:tbl.a=f,则这个函数可以从tbl表中访问 >print(tbl.a(1)) 输出3; ②定义新函数:您可以直接
把函数定义为名称空间的一部分,而不是先用全局变量定义一个函数再把它设置为名称空间的一部分,如: >function tbl.f(x) >local total=1 >for i=1,num do >total=total
*i >end >return total >end.

8.①用冒号调用对象的方法,你可以使用一个冒号来代替句点,这个对象将会作为方法的第一个参数.如:counter:get()来代替count.get(counter).②用冒号定义函数,如
fuctiontbl:MyMethod()end代替function tbl.MyMethod(tbl)end.
9.为一个表添加一个元表:函数setmetatalbe(tbl,mt),(tbl待改变的表,mt附加到tbl的表既元表),函数只有一个返回值既tbl;函数getmetatable()检验元表是否创建成功,这个
函数将表作为第一个参数,返回一个元表.当没有元表时,它返回nil. 如>print(getmetabable(tbl))==mt.

10.⑴定义元方法:元方法(metamethod)其实是一个函数,它存储在元表中,且带有一个给定的键.元方法有很多种,起参数各不相同,每一个元方法都以两个下划线字符开头.如_ _add
()定义加法的行为、_ _mul() 定义乘法的行为、_ _unm() 定义非的行为(一元减法),当在表中使用时既把表中的元素的序列逆序排序、_ _tostring() 定义表示表示tostring()
的参数的行为,它也会影响到直接调用tostring()的print()函数,改元方法可以把表中的元素分别显示而不是显示为一个单独的字符串、_ _concat() 定义当使用连接操作时的
行为,还有_ _div()表除法的行为、_ _sub()表减法的行为.
注意:_ _add、_ _sub、_ _mul、_ _div元方法都有两个参数,并且(理论上)可以返回任何您想要的值,但是记住下面内容:①操作的结果可能是一个更大型的算术表达式的一部分
②如果从元方法返回一个非数字的元素,就应该确保它可以进行算数运算③如果返回nil,就会破坏它所在的任何算术表达式
⑵.例子:>tbl1={"aa","bb","cc"},>>tbl2={"dd","ee","ff"} >>function mt.--add(a,b) >>local result=setmetatable({},mt) >>for i=1,#a do >>table.insert(re
sult,a[i]) >>end >>for i=1,#b do >>table.insert(result,b[i]) >>end >>return result >>end 运行下面的代码>add_test=tbl1+tbl2 >>print(#add_test) 输出6
>for i=1,#add_test do print(i,add_test([i])) end
输出
1,aa
2,bb
3,cc
4,dd
5,ee
6,ff

⑶.使用_ _unm()元方法的的例子:  
⑷.使用_ _tostring()元方法的例子:
⑸.使用_ _concat()元方法:>mt._ _concat=mt._ _add >print(tbl1..tbl2) 输出(aa,bb,cc,dd,ee,ff) 以为_ _tosting()元方法仍处于激活状态,结果表被转为串表达式,
甚至显示时也如此.


                                                           高级函数和控制结构

1.颜色表示中用十六进制值(如99CCFF)和红、绿、蓝的百分比(如0.6,0.8,1.0)表示,因此,很有必要将十六进制的字符串转换成红、绿、蓝三色组成值,其中函数string.sub()
能将十六进制值的串分解为3个颜色串,而且tonumber()函数可以将串转为数值,默认其况下该函数的参数为十进制数(也就是说以10为基数) 例如>print(tonumber("FF"))
输出nil   所以它不能转换十六进制数。tonumber()的第二个参数表示待转换串的基数,如>print(tomuber("FF",16))

2.在lua中函数可以返回多个值,例如a,b,c=someFunction(),但注意函数在下列情况下时的返回值可能丢失,print(a(x),"heihei")其中a(x)的返回值有3个,则输出第一个值
和heihei,再如>a,b,c=a(x),"very","well",>print(a,b,c)则输出第一个值,very,well 既是当函数调用所得的多个返回值是另一个函数最后一个参数时,所有的返回值将被
传入或使用,否则只用第一个返回值被使用或指定.您可以将函数调用包含在小括号里,一限制它只有一个返回值,如下所示>print((a(x)))
 
.
.
.
.
.
.

                                                               lua 标准库
一.表库中的函数的用法
1.table.concat(table[,sep[,i[,j]]]) sep参数默认值是一个空字符串,i的默认值是1,j的默认值是表的长度,如果i比j大,那么这个函数会返回一个
空串 例如>tbl={"alpha","beta","gamma"} >print(table.concat(tbl,":")) 输出alpha:beta:gamma 再如>print(table.concat(tbl,nil,1,2)) 输出alphabeta

2.table.maxn(table)这个函数将返回表中最大的索引,当表中不存在正的数字索引时,将返回0(要完成这个工作,这个函数将会对整个表进行一次线性遍历) 例如>tbl={[1]="a",
[2]="b",[3]="c",[26]="z"} >print(#tbl) 输出3 >print(table.maxn(tbl)) 输出26 >tbl[63.20]=ture >print(table.maxu(tbl)) 输出63.20
注意:table.maxn()函数考虑数值的键值而不是整数的键值,因此,常数和分数可以一样的计算

3.对table.remove(table[,pos])函数其中pos的默认值是n(n为表的长度);函数table.insert(tbl,[pos,],value);
4.函数table.sort(table[,comp])将一个表的数组部分排序以及元素的数值部分或者其他一些标准,即改变该表中的元素的顺序.如果给定一个comp参数(comp为函数),那么它必须
接受两个元素作为参数,并且当第一个参数小于第二个参数的时候返回ture(因此在排序之后comp[a[i-1],a[i]应该为ture),如果comp没有给出,将会使用标准的lua运算符"<".
将会按字母顺序升序(默认),如果包含数字,则排序方式相同.

二.数学函数库的用法
math.deg(x)返回所给弧度x所对应的角度值 例如>print(math.deg(pi)) 输出180; 函数math.rad(x)返回给定的x的角度所对应的弧度; 函数math.exp(x)返回e的x次方的值;
函数math.fmod(x,y)返回x除以y所得的余数,您可以用x%y的到相同的值;函数math.modf(x)返回两个数,一个为x的整数部分和小数部分;函数math.random([m[,n]]⑴.当不用
参数调用这个函数的时候,它会产生一个0-1之间(不包含1)的伪随机数;⑵.当使用一个参数m的时候返回1-m之间(包含边界)的伪随机数;⑶如果用两个参数m,n则产生m-n之间
(包含边界)的伪随机数; 函数math.randomseed(x)为lua生成一个种子来产生一系列的伪随机数,一个相同的种子产生出来的序列总是相同的  例如>math.randomseed(1000)
>print(math.random(100)) 输出1 >print(math.random(100)) 输出54  >print(math.random(100)) 输出61 同样的>math.randomseed(1000) >print(math.random(100))
输出1 >print(math.random(100)) 输出54  >print(math.random(100)) 输出61

三.字符串函数的使用
1.函数string.len(x)其中空字符串的长度是0,嵌套多个0字符将被记数为1,因此字符串"a\000bc\000"的长度是5;string.lower(s)和string.upper(s)函数将接收一个字符串
并返回一份拷贝,string.lower(s)将所有大写字母转换为小写字母,其余的字符保持不变.strin.upper(s)相反;string.rep(s,n)返回一个字符串,有连续的n个字符串s组成
例如 >print(string.rep("hello",2)) 输出hellohello;string.reverse(s)函数将返回逆序字符串s,例如print(string.reverse("Test")输出Tset;

四.格式化新字符串函数的使用
1.lua提供一个辅助函数,既string.format(formatting,...),它会根据所定义的格式,格式化参数表中的任意多个参数,并基于fomatting字符串进行输出.例如%c表示取一个数字
参数然后用对应ASCII码的字符代替这个位置,例如print(string.format("%c",83))输出S;%d,%%i表示取一个数字参数,将其格式化为一个整数(%d不表示格式化为10进制数);

2.%x和%X分别表示将其格式化为十六进制数,并分别使用小写字母和大写字母,例如pring(string.format("x",13))输出d;%q表示格式化一个字符串,使得它可以安全的被Lua解析
器读取;%s表示接收一个字符串,并按照给定的选项进行格式化,例如pring(string.format("%c","Monkey"))输出Monkey;%g,%G取一个数字,并按照较短原则转换成%e(或者%G的
时候是%E)或%f.还有%o、%e、%E、%f、%X在此并不一一举例.

3.注意:在百分号和指示符之间可以有多个选项,包括下面的选项(按照这里给出的顺序排列)①.一个符号指定(+或-)会使一个数字输出时前面总带有符号,而默认情况下只有负数前
显示"-"; ②.一个填充字符(空格或0)可以在一个指定的宽度的输出中填充多余的空位,默认使用空格填充—仅当指出输出宽度的时候.③一个短横线表示输出时是左对齐还是右对齐
,默认是右对齐,而在加了"-"时表示左对齐;④(可选)一个宽度指定符可以指定返回的字符串的最小宽度;⑤(可选)一个精度指定符表示格式化浮点数后保留几位十进制小数,当
为字符串指定该选项的时,结果的字符串会按这个数字的长度截断;⑥一个类型指示符表示参数应该看为什么类型.

4.特例:在WoW中包括看一个额外的string.format()选项,从而让您选择参数表中的一个参数,而不是直接用下一个参数.要选择一个指定的参数,必须包括参数的序号,并放在百分号
之后再紧跟一个美元符号($),例如:>print(string.format("%2$d,%1$d,%d",13,17))输出17,13,13 注意:以这样的方式选择参数的时候,您不可能跳过任何一个参数并且不使用
它们.如果您使用了参数1和3那么也必须使用参数2,您可以混合使用参数选择和一 般类型指示符而不做任何声明.

原创粉丝点击