lua基础(一)

来源:互联网 发布:淘宝数据真实数据 编辑:程序博客网 时间:2024/04/28 20:11

最近在学习unity的热更,看了下 lua 基础,看了这位博主转载的文章觉得还不错,保存下来,方便以后回顾

原文地址:http://blog.csdn.net/lyh916/article/details/49719697

一.注释

[plain] view plain copy
  1. --这是行注释  
  2.   
  3. --[[  
  4. 这是块注释  
  5. 这是块注释  
  6. 这是块注释  
  7. --]]  
  8.   
  9. --如果想取消块注释,只需将 --[[ 改为 ---[[  


二.类型与值

[plain] view plain copy
  1. --lua有8种基础类型:nil/boolean/number/string/userdata/function/thread/table  
  2. --即空/布尔/数字/字符串/自定义类型/函数/线程/表  
  3. --函数type可根据一个值返回其类型名称  
  4.   
  5. print(type("Hello World"))      --string  
  6. print(type(10))                 --number  
  7. print(type(print))              --function  
  8. print(type(type))               --function  
  9. print(type(true))               --boolean  
  10. print(type(nil))                --nil  
  11. print(type(type(X)))            --string 因为type函数总是返回一个字符串  
  12.   
  13.   
  14. --变量没有预定义的类型,任何变量都可以包含任何类型的值  
  15.   
  16. print(type(a))                  --nil  
  17. a = 10  
  18. print(type(a))                  --number  
  19. a = "Hello"  
  20. print(type(a))                  --string  
  21. a = print                       --函数是一种类型  
  22. a(type(a))                      --function  

nil:它只有一个值nil,作用类似于其他语言的null,可以将nil赋予一个变量表示删除这个变量

boolean:取值为true或者false。在lua中,false和nil表示假,除此之外的其他值为真

number:表示双精度浮点数(double)


string:字符串是不可变的值,不能直接修改字符串中的某个字符,若要修改,则要新建一个新的字符串。

字符串由一对单引号或者一对双引号来表示:a = "a line"        b = 'another line'

常用的转义字符:\n-----换行     \\-----反斜杠     \"-----双引号     \'-----单引号

另外,还可以用一对匹配的双方括号来表示一个字符串,这时将会忽视转义字符:

[plain] view plain copy
  1. page = [[  
  2. <html>  
  3. <head>  
  4. <title>an html page</title>  
  5. </head>  
  6. <body>  
  7. <a href="http://www.lua.org">Lua</a>  
  8. </body>  
  9. </html>  
  10. ]]  
  11. print(page)  


lua还提供了运行时的数字与字符串的自动转换:

[plain] view plain copy
  1. --字符串转数字  
  2. print("10" + 1)       --11  
  3. print("10" + "1")     --11  
  4.   
  5. --数字转字符串  
  6. print(10)             --10  
  7. print(10 .. 20)       --1020   
  8.   
  9. --..是字符串连接操作符,当直接在一个数字后面输入它时,  
  10. --必须要用一个空格来分隔它们,不然lua会将第一个点理解为小数点  
  11.   
  12.   
  13. --比较10=="10"总为false,因为10是数字,"10"是字符串  
  14. --以上是隐式转换,使用tonumber/tostring可以显示转换  
  15.   
  16. print(tostring(10) == "10")     --true  
  17. print(10 .. "" == "10")         --true  
  18.   
  19.   
  20. --#可以换取字符串的长度  
  21. a = "hello"  
  22. print(#a)                       --5  



table:类似于哈希表。table中的key可以是任何类型的值(除了nil)。table的创建是通过构造表达式完成的。最简单的构造表达式就是{}

[plain] view plain copy
  1. a = {}                --创建一个table,并将它的引用存储到a  
  2. k = "x"  
  3. a[k] = 10             --key="x",value=10  
  4. a[20] = "great"       --key=20,value="great"  
  5.   
  6. print(a["x"])         --10  
  7. print(a[20])          --great  
  8. a["x"] = a["x"] + 1  
  9. print(a["x"])         --11  

[plain] view plain copy
  1. a = {}                --创建一个table,并将它的引用存储到a  
  2. a["x"] = 10  
  3. b = a                 --b与a引用了同一个table  
  4.   
  5. print(b["x"])         --10  
  6. b["x"] = 20  
  7. print(a["x"])         --20  
  8. a = nil               --现在只有b还在引用table  
  9. b = nil               --再也没有对table的引用了  

[plain] view plain copy
  1. a = {}  
  2. x = "y"  
  3. a[x] = 10  
  4. print(a[x])    --10  
  5. print(a.x)     --nil  
  6. print(a.y)     --10  
  7.   
  8. --a.x等同于a["x"]  

[plain] view plain copy
  1. --若要表示一个传统的数组或者线性表,只需以整数作为key来使用table即可  
  2. --不同于许多语言,lua习惯以1作为数组开始  
  3. a = {}  
  4. for i = 1,5 do  
  5.     a[i] = i  
  6. end  
  7.   
  8. --#长度操作符,可获取table或者字符串的长度  
  9. for i = 1,#a do  
  10.     print(a[i]);             --1到5  
  11. end  
  12.   
  13. --注意是以1作为数组开始  
  14. print(a[#a])                 --5  
  15. a[#a] = nil                  --删除a[5]  
  16. a[#a+1] = 10                 --a[5]=10  
  17. print(a[#a])                 --10  

请记住对于所有未初始化的元素的索引结果都是nil。lua将nil作为界定数组结尾的标志。如果数组中含有nil,此时使用#就不安全了,可以使用table.maxn,它将返回一个table的最大正索引数。
[plain] view plain copy
  1. a = {}  
  2. for i = 1,5 do  
  3.     a[i] = i  
  4. end  
  5.   
  6. a[4] = nil  
  7. print(#a)               --3  
  8. print(table.maxn(a))    --5  


function、userdata和thread暂略,后面再提。


三.表达式

lua的操作符跟c大致相同,除了以下的:

其他语言lua!=~=&&and||or!not
注意:
and:如果第一个操作数为假,则返回第一个操作数;否则返回第二个操作数。

or:如果第一个操作数为真,则返回第一个操作数;否则返回第二个操作数。



table构造式:

table有三种方式进行初始化:

1.

days = {"Sunday","Monday","Tuseday"}

上面只指定了value,但没有指定key。这种情况下,lua会给没有key的value指定一个默认的key,从1开始,每次加1递增。

[plain] view plain copy
  1. days = {"Sunday","Monday","Tuseday"}  
  2. print(days[0])    --nil  
  3. print(days[1])    --Sunday  
  4. print(days[2])    --Monday  

2.

[plain] view plain copy
  1. a = {x = 10,y = 20}     --等价于a={};a.x=10;a.y=20  
  2. print(a["x"])           --10  
  3. print(a["y"])           --20  


混合使用:

[plain] view plain copy
  1. polyline = {color="blue",thickness=2,npoints=4,  
  2. {x=10,y=20},  
  3. {x=30,y=40},  
  4. {x=50,y=60},  
  5. {x=70,y=80},  
  6. }  
  7. print(polyline[2].x)     --30  
  8. print(polyline[4].y)     --80  

3.

[plain] view plain copy
  1. opnames = {  
  2. ["+"] = "add",  
  3. ["-"] = "sub",  
  4. ["*"] = "mul",  
  5. ["/"] = "div",  
  6. }  
  7.   
  8. i = 20;s = "+"  
  9. a = {  
  10. [i+0] = s,  
  11. [i+1] = s..s,  
  12. [i+2] = s..s..s,  
  13. }  
  14.   
  15. print(opnames[s])     --add  
  16. print(a[22])          --+++  



四,语句

多重赋值:将多个值赋予多个变量

[plain] view plain copy
  1. a,b = 10,20  
  2. print(a)           --10  
  3. print(b)           --20  
  4.   
  5. --在多重赋值中,lua先对等号右边的所有元素求值,然后才执行赋值  
  6. --利用这个特性,可以很好地实现变量的值交换  
  7.   
  8. a,b = b,a  
  9. print(a)           --20  
  10. print(b)           --10  
  11.   
  12. --若值的个数少于变量的个数,那么多余的变量会被赋值为nil  
  13. --若值的个数多于变量的个数,那么多余的值会被丢弃  
  14.   
  15. a,b,c = 1,2  
  16. print(a,b,c)       --1 2 nil  
  17. a,b,c = 10,20,30,40  
  18. print(a,b,c)       --10 20 30  


局部变量与块:

与全局变量不同的是,局部变量的作用域仅限于声明它们的那个块。一个块是一个控制结构的执行体、或者是一个函数的执行体再或者是一个程序块。

[plain] view plain copy
  1. x = 10               --全局变量  
  2. local i = 1          --局部变量  
  3.   
  4. while i <= x do  
  5. local x = i * 2  
  6. print(x)             --2,4,6。。。  
  7. i = i + 1  
  8. end  
  9.   
  10. if(i > 20) then  
  11. local x = 20  
  12. print(x + 2)  
  13. else  
  14. print(x)              --10,全局变量  
  15. end  
  16.   
  17. print(x)              --10,全局变量  
请注意,如果是在交互模式中输入这段代码的话,该示例可能不会如预期的那样工作。因为在交互模式中每行输入内容自身就形成了一个程序块。一旦输入了本例的第二行local i = 1 ,lua会马上运行这句话,并为下一行的运行开启一个新的程序块。到那时local声明就已经超出其作用域。为了解决这个问题,可以显式地界定一个块,只需将这些内容放入一对do-end中即可。当输入了do,lua就不会单独地执行后面每行的内容,而是直至遇到一个相应的end时,才会执行整个块的内容。


控制结构:

[plain] view plain copy
  1. --------------------if----------------  
  2. a = 70  
  3.   
  4. if (a < 100 and a >= 80) then  
  5. print("A")  
  6. elseif (a < 80 and a >= 60) then  
  7. print("B")  
  8. else  
  9. print("C")  
  10. end  
  11.   
  12. --------------------while----------------  
  13. local i = 1  
  14. while (i <= 3) do  
  15.     print(i)  
  16.     i = i + 1  
  17. end  
  18.   
  19. --------------------repeat----------------至少执行一次循环体  
  20. local i = 10  
  21. repeat  
  22. i = i + 1  
  23. print(i)  
  24. until (i > 13)  
  25.   
  26. --------------------数字型for----------------  
  27. for i = 100,103,1 do    --100到103,步长为1,其中步长可以省略,默认步长为1  
  28. print(i)                --for的三个值是循环前一次性求值的  
  29. end                     --控制变量在循环结束后就不存在了  
  30.   
  31.   
  32. --------------------泛型for----------------  
  33. a = {"one","two","three"}  
  34. for i,v in ipairs(a) do            --i为索引值,v为对应元素值  
  35. print("第"..i.."个元素为"..v)  
  36. end  
  37.   
  38.   
  39. b = {x="xx",y="yy",z="zz"}  
  40. for k,v in pairs(b) do  
  41. print("键  "..k.."  值  "..v)  
  42. end  
  43.   
  44.   
  45. --标准库提供了几种迭代器,包含用于迭代文件中每行的io.lines  
  46. --迭代数组的ipairs,迭代table的pairs,迭代字符串中单词的string.gmatch  
  47.   
  48. --lua中的break和return与其他语言类似,所以省略  

1 0
原创粉丝点击