Lua初学习 9-12 基础

1:string 转 number :tonumber(string)

2: number 转 string :tostring(number)

3:string API:

       Lua中的字符串是不可变值,a = "cocotang"  string.gsub(a,"c","z")  print(a) ----> cocotang

        1获得字符串长度:string.len(string)  或者 #string

        2拼接2个字符串: string..string     &&    如果是2个number number .. number(空格不然误认为小数点)

        3截取字符串,组成新的字符串:string.gsub(a,"cc","zz",index) a字符串中的 cc 由 zz 代替 直到index位置

        4查找字符串中的某字符串位置:string.find(a,"coco") 返回2个值 c 的index 与 o的index

4:io.read() 获取控制台输入

5: Table创建一个List(数组)

           a={}

           1:当key 赋值1-10时,len = 10

           2:当key 赋值0-10时,len = 10 (同上)

          Lua中通常用 1 来做 Index的初始值  (table.maxn(a))--->返回最大正索引 Index

6:取精度 

     x = 3.123456 print(x-x%0.001)   ---->3.123

     x%1 结果是 x的小数部分 0.123456

     x-x%1 结果是 x的整数部分 3   

     x-x%0.001 结果是 x取小数点后三位

7:运算符

     > < == >= <= 同于C#

      ~= 不等于(C# !=)

      Lua中取反 not(空格)   (C# !)

8:运算优先级

      基本同于C#,直接用括号显示的表现优先级 容易理解

      -x^2  -------> -(x^2)

      x^y^z --------->x^(y^z)

9:Table构造式

     a = {x = 10 , y = 20} 等价于a ={["x"]=10 ,["y" =20]}  等价于 a = {} a["x"] =10 a["y"] =20  等价于 a = {} a.x= 10 a.y = 20

10:Table里面删除一个变量

      a = {} a.x= 10  a.x= nil

11:交换变量(Lua里面有点特别) (多重赋值 调函数时传入的实参多余或者少于形参时,与多重赋值非常相似)

     C#中:int a=1;int b=2; 交换: int c = a; a =b; b=c;

     Lua中:a = 1 b = 2  交换:a,b = b,a

     a,b = 1,2,3 ---->舍弃3

     a,b,c = 1,2  ----->c=nil

12:流程控制

     1由于Lua不支持Switch语句,所以一连串的if elseif 是很常见的

     2循环中用break可以跳出循环

13:Lua中没有 ++ --,并且 +=  -=也没有    如果递增1 a=a+1

14:Lua中的Foreach( Generic for)

      1遍历所有k: a = {x=1,y=2,z=3;"one","two","three"}

        for k in pairs(a) do

        print(k)  ------>  1 2 3 y x z

        end

       2遍历所有v:

         for i , v in pairs(a) do

         print(v)  -------> one two three 2 1 3

         end

        2-2 遍历所有的v         

        for k in pairs(a) do

        print(a[k])  ------>  1 2 3 y x z

        end

        3遍历数组a的所有值

        for i , v in ipairs(a) do

        print(v)  ---------> one two three

        end

    值得注意的是:遍历数组a中的值,ipairs(a) 输出的并不是所有的value,以后慢慢了解

15:逆向Table(反转key value)

       a = {x=1, y =2, z =3}

       b = {}

       for k,v in pairs(a) do

       b[v] = k

       end

16:break与return

       break跳出循环,return跳出方法

       注意:但是如果return在if前面  报错

17:方法的调用

       a = {}

       function a:Test() print("orz") end

       第一种调:a:Test()    第二种调:a.Test() 注意第二种隐式的传入了a  --->a.Test(a)

       假如 function有一个参数,用第二种调 a.Test(n) 报错,应该---> a.Test(a,n)

18:方法的返回值

     function foo1() end 无返回值

     function foo2() return 1 end 返回一个值

     function foo3() return 1,2 end 返回两个值

     x,y = foo3() ----> x =1, y = 2

     x = foo3()  ------> x =1 ,  2被丢弃

     x,y,z = foo3() ----->x=1,y=2,z=nil

     x,y = foo3(),99  ----->x = 1,y = 99

     x,y = foo1(),20,30 ---->x = nil , y =20    30被丢弃

     注意:Table 可以接受 函数返回的所有值,前提是函数作为table构造式中最后一个参数,如果不是最后一个参数,那么只会取第一个返回值,无返回值则为nil

     如果强行让函数返回第一个值,可以用一对小括号 括起来函数 ---> (foo()) 不管foo有几个返回值,都只返回第一个,没有返回nil

      特殊内置函数 unpack:它接受一个数组作为参数,并从下标1开始返回该数组的所有元素

       例如:print(unpack({1,2,3,4,5,66}))   ----> 1,2,3,4,5,66

19: 算术类元方法

__add()   + 运算对应的元方法
__sub()   
__mul
__div
__mod
__pow
__unm     相反数
__concat  .. 运算对应的元方法