美文网首页
Lua简明基础小总结

Lua简明基础小总结

作者: smile丽语 | 来源:发表于2019-12-20 14:23 被阅读0次

    0. 扫盲

    0.1 Lua基础简明教程

    -> 参考文档:https://www.zybuluo.com/lisaisacat/note/636399

    -> Lua字符串:www.runoob.com/lua/lua-strings.html

    -> Mac上Sublime Text3配置Lua环境:https://www.jianshu.com/p/3bbb2a040fed

    -> Mac上Sublime Text3配置安装Lua环境:https://segmentfault.com/a/1190000017494363

    -> Mac上Sublime Text3配置安装Lua环境:https://www.cnblogs.com/baaingSheep/p/5145045.html


    1. Lua编程Basic

    1.1 注释备注

    // 相当于//

    -- 单行注释

    // 相当于/**/,由"--[["表示注释开始,并且一直延续到"]]"为止。在注释当中,"[["和"]]"是可以嵌套的

    --[[多行注释]]

    1.2 语句块

    // 等同于{},可以在函数中和语句块中定义局部变量

    do … end

    do print("Hello world") end
    

    1.3 赋值语句(不需要声明,可以给多个变量赋值)

    // 默认是全局变量

    a,b,c,d=1,2,3,4

    // 交换变量数值

    a,b=b,a

    // 局部变量,定义时,第一次赋值时,需要用local说明

    local a=1

    1.4 分支 条件控制

    // 相当于if(x){}

    if x then … end

    if x then … else … end

    if x then … elseif x then … else... end

    1.5 循环语句

    ->主要循环类型:

    --1\. while (true) do ... end(等同于while(){…})
    
    --2\. repeat … until (true)  (等同于 do {} while(!a))
    
    --3\. for 变量i=起始值a, 最大值b,步进值c do … end (等同于与 for(int i=a,i<=b,i+=c){…},步进值默认为 1,可省略,相当于i++)
    
    --4\. for 变量1,变量2,..,变量N in表/枚举函数 do … end
    

    --1. while (true) do ... end 等同于while(){...}

    my_table = {1,2,3}
    
    local index = 1 -- 注意: table 中的索引从1开始
    
    while my_table[index] do -- 只要条件返回True,就一直执行循环
    
        print(my_table[index])
    
        index = index + 1    -- Lua中没有i++ 的写法,所以只能用i=I+1
    
    end
    
     -- 输出 1
    
     --      2
    
     --      3
    

    --2.repeat … until (true) 等同于do...while

    local snum = 1 --起始值
    
    repeat
    
        print("snum is "..snum)
    
        snum = snum + 1
    
    until snum == 4  --当snum 等于 4 时(条件是True) 跳出循环
    
     --输出:
    
     --snum is 1
    
     --snum is 2
    
     --snum is 3
    

    ->PS注意:for的循环变量总是只作用于for的局部变量,可以用break来中止一个循环。

    --3.for i=a, b,c do … end (步进值c默认为1,可省略)

    for i = 1, 6, 2  do --这里i=1表示起始值, 10表示最大值, 2表示步进值(等同于i+2)
    
       print("i = "..i)
    
    end
    
    --输出:
    
    --i = 1
    
    --i = 3
    
    --i = 5
    

    --4.for 变量1,变量2,..,变量N in表/枚举函数 do … end for循环练习 arr={1,2,3} for i=1,#arr do … end

    arr={1,2,3}
    
    for i = 1, #arr do -- #arr表示取表的长度,相当于OC的.count(步进值默认值为1,等同于i++)
    
        print("arr[i] = "..arr[I])
    
    end
    
    -- 输出:步进值默认为1,从arr[1]开始循环输出
    
    --arr[i] = 1
    
    --arr[i] = 2
    
    --arr[i] = 3
    

    1.6 运算

    ->大致类型

    --1\. 数值运算(+, -, *, /,^)
    
    --2\. 比较运算(<, >, <=, >=, ==, ~=)所有这些操作符总是返回 true 或 false。
    
    --3\. 逻辑运算 (and, or, not)
    

    --1. ^ 乘方

    2^3 // 8

    --2. ~= 不等于

    对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如:

    // PS: Table类型相当于对象类型,和OC创建对象产生所属地址的形式一样。
    
     a={1,2}
    
     b=a
    
     print(a==b, a~=b) -- true, false -- a==b,两个变量引用同一个数据
    
     a={1,2}
    
     b={1,2}
    
     print(a==b, a~=b) -- false, true —-两个对象
    

    --3. and 与(找假),只有 false 和 nil 才计算为 false

    a and b: 如果a为false,则返回a;否则返回b 
    
    5 and 6 // 6
    
    nil and 6 // nil
    
    false and 6 // false
    

    --4. or 或(找真),0和空串 也是 true

    a or b: 如果 a 为true,则返回a;否则返回b 
    
    5 or 6 // 5
    
    nil or 6 // 6
    
    0 or 6 // 0
    

    // 常用

    x = x or v(等同于 if not x then x = v end )

    // 三目(等同于 x=a?b:c)

    x = a and b or c

    --5. not 非

    --6. 优先级

    ^
    
    not(一元运算),
    
    */, 
    
    +-,
    
    ..(字符串连接),
    
    < > <= >= ~= ==,
    
    and,
    
    or,  
    

    1.7 字符串拼接".."运处符

    "hello," .. "world." -- 等于 “hello,world."

    1.8 关键字(不能做变量)

    and、or、not、break、do、end、if、else、elseif、false、for、function、in、local、nil、repeat、return、then、true、until、while


    2. 变量类型及定义

    2.1 变量类型的分类:

    --1\. Nil 空值
    
    --2\. Boolean 布尔值
    
    --3\. Number 数值
    
    --4\. String 字符串
    
    --5\. Table 关系表类型
    
    --6\. Function 函数类型
    
    --7\. Userdata
    
    --8.Thread  线程类型
    

    2.2 判断变量类型的函数

    // 判读类型:返回string

    type()函数

    2.3 具体的变量类型

    --1. nil 空值

    未定义(没有使用过)的值,都是nil。nil既是值,又是类型。

    // 用法:

    将一个变量清除,可直接给变量赋以nil值。

    a = nil -- 请注意nil一定要小写
    

    --2. Boolean 布尔值

    true/false(只有false和nil是false,0不是false)

    // 用法:通常用在进行条件判断的时候

    可以直接给一个变量赋以Boolean类型的值

    varboolean = true
    

    --3. Number 数值

    相当于C中的double,在Lua中,是没有整数类型的,也不需要。

    print(0.4); -- 0.4
    
    print(4e-3); -- 0.004
    
    print(4e2); -- 400.0 =( 4X10^2)
    
    print(4e+2); -- 400.0
    

    --4. String 字符串

    4.1 String 字符串,字符串可以包含'\0'字符的

    “bzc”

    ‘ab’

    [[ abc\c\d ]] --用"[["和"]]"将多行的字符串括起来

    4.2 转义字符
    \a -- 响铃(BEL)
    
    \b --  后退
    
    \f  --  换页
    
    \n --  换行
    
    \r -- 回车
    
    \t --  制表
    
    \v -- 垂直制表(VT) vertical tab
    
    \\ -- “\"
    
    \" --  双引号
    
    \' --  单引号
    
    \[ --  左中括号
    
    \] --  右中括号
    
    4.3 替换
    --  string.gsub (s, pattern, repl [, n])
    
    str = "abc";
    
    newstring = string.**gsub**(str,"ab","cd"); -- cdc
    
    4.4 拼接
    str = "abc" **..** "de"// abcde
    
    4.5 转换
    // string转number
    
    **tonumber**("10”)
    
    // number转string
    
    **tostring**(10)
    
    // 自动转number
    
    str =  “10”**+** 1 -- 11
    
    4.6 查找
    // 返回两个参数,开始坐标,结束坐标 string.find (s, pattern [, init [, plain]])
    
    startIndex, endIndex = string.**find**("hello world","llo”); —- 3 5
    

    www.runoob.com/lua/lua-strings.html

    --5. Table 关系表类型

    可以看做是一个数组,里面可以放任意类型(除了nil),从1开始;也可以用任意类型来做数组的索引(除了nil)。

    我们在写的时候,需要注意三点:

    第一,所有元素之间,总是用逗号","隔开;

    第二,所有索引值都需要用"["和"]"括起来;如果是字符串,还可以去掉引号和中括号;

    第三,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编。

    arr = {1,2,3,4,5,6,7}
    
    dict = {} -- 定义一个空表
    
    dict[0] = 5 -- 然后我们就可以象C语言一样来使用它了
    
    dict["arr”] = arr;
    
    dict[arr] = {0,1};
    
    dict = {
    
            10, --相当于[1]=10 —-不加下标的优先排
    
            [100] = 44,
    
            Zl = -- 如果你原意,你还可以写成:["Zl"] =
    
            {
    
                    age=18,--相当于["age”]=18
    
                    sex=“nv”
    
            },
    
            20 --相当于[2]=20
    
    }
    

    // key是字符串的时候可以用.来访问(当表的索引是字符串的时候,我们可以简写成点的方式获取)

    dict.arr=“bb”

    // 获取长度(去找nil结束的#运算符)

    len = #dict.arr —- 上述dict的zl为2

    遍历

    // 依下标遍历(ipairs)。碰到nil退出

    arr = {[1]=3, [2]=5, [5]=6} —-i下标是1和2;V结果为3和5
    
    for i,v in ipairs(arr) do
    
        print("i = "..i)
    
        print("v = "..v)
    
    end
    
    --输出:
    
    --i = 1
    
    --v = 3
    
    --i = 2
    
    --v = 5
    

    // 遍历所有(pairs)

    arr = {[1]=3, [5]=6}
    
    for k,v in pairs(arr) do
    
            print(k,v)
    
    end
    

    // 遍历所有,步进值默认为1

    for i=1,10 do --这里i=1表示起始值, 10表示最大值,(步进值可以没有,默认值为1,也就是其他语言里的i++)
    
        print(i)
    
    end
    

    类相关

    -- 定义一个对象
    
    ZL = {
    
        name = "zl";
    
        Age = 18,
    
        Gender = girl,
    
        show = function ( this )
    
            print("My name is "..this.name)
    
        end
    
    }
    
    —- 也可以放在table外面定义方法
    
    ZL.show = function ( this, a )
    
            print("My name is "..this.name.."\n外界传值为"..a)
    
    end
    

    调用方法

    // 调用方法
    ZL**.**show(ZL, 666)
    
    ZL **: **show(666)
    

    --6. Function 函数类型

    注意事项:用触动精灵开发脚本时,要把封装函数写在调用前面,因为脚本是按照从上到下的顺序执行的。

    // 定义 函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。

    -- 定义
    
    function sum( a,b ) --sum 是函数名字,a和b是参数名字
    
            return a,b  -- return 用来返回函数的运行结果
    
    end
    
    sum = function ( a,b )
    
            return a,b
    
    end
    

    调用:当调用结果作为参数的时候,只有一个参数,或者是最后一个参数的时候,返回多个,其他的情况返回一个

    -- 调用
    
    sum(5,6)
    
    -- 当调用结果作为参数的时候,只有一个参数,或者是最后一个参数的时候,返回多个,其他的情况返回一个
    
    print(sum(5,6)) -- 5,6
    
    print(sum(5,6),1) -- 5,1
    
    print(2,sum(5,6)) -- 2,5,6
    
    -- 可以用()强制函数值返回一个值
    
    print((sum(5,6))) -- 5
    

    // unpack(a):返回返回a的所有元素做为参数

    // f(unpack(a))等同于string.find(“hello”,”11")
    
    f = string.find
    
    a = {"hello",  "ll”}
    
    print(f(unpack(a)))  
    
    // 可变长参数
    
    function sum( x,... )
    
          // 获取可变参数列表 
    
           arg = { ... }
    
            local s = 0
    
            for i,v in ipairs(arg) do
    
                    s=s+v
    
            end
    
            return s
    
    end
    
    print(sum(5,6,7,8,9)) 
    

    --7. Userdata

    用于与Lua的宿主打交道.宿主通常是用C和C++来编写的,Userdata可以是宿主的任意数据类型,常用的有Struct结构体和指针.

    --8. Thread 线程类型

    在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。

    相关文章

      网友评论

          本文标题:Lua简明基础小总结

          本文链接:https://www.haomeiwen.com/subject/zanbnctx.html