• Lua


    Lua编写与运行环境:

    同python一样,可以在Linux下直接通过 lua 命令进行交互shell中运行,也可以通过 lua test.lua 文件运行,也可以在lua脚本里首行加上 #!/usr/bin/lua ,设置为可执行文件即可直接运行。

    Lua数字型number,实际上只有64位double型。

    字符串的定义有三种,使用单引号、双引号、双中括号,其中双中括号表示非转义字符串。

    只有nil和false是false,其它都是true,包括其它语言中常见的0。

    Lua里的变量,如果不使用local修饰则表示是全局变量,即使是处于函数或语句块中也是一样。

    Lua没有++/+=此类操作,不等于用 ~= 表示,io.read() 与 io.write() 表示从stdio与stdout读写,字符串拼接使用../

    repeat..until 相当于do..while

    同golang一样,函数也可以返回多个值

    Lua的table里可以存放任何类型,比如函数

    t = {"hello",100,true,function() print "function()" end}
    t[4]()
    print(#t)  --输出t的长度

    函数有两种定义方式:

    function func1()
        print("func1")
    end
    
    func2 = function()
        print("func2")
    end

     Lua的全局变量全部存储于 _G 的表中,如:

    global_str = "dfdf"
    print(_G.global_str)
    print(_G["global_str"])

    遍历table:

    t = {"hello",100,true,function()  print "function()"  end}
    for k,v in pairs(t) do
        print(k,v)
    end

    元表:

    local t = {}
    function t.__add(a, b)
        local sum = 0
        for _, v in pairs(a) do 
            sum = sum + v 
        end
        for _, v in pairs(b) do 
            sum = sum + v 
        end
        return sum
    end
    t.__metatable = "lock"
    
    local t1 = {1,2,3}
    local t2 = {4,5,6}
    setmetatable(t1,t)
    setmetatable(t2,t)
    
    --setmetatable(t2,t1)
    --setmetatable(t2,t)
    --assert(t == getmetatable(t1))
    --assert(t == getmetatable(t2))
    --setmetatable(t1,t2)
    --print(getmetatable(t1))
    
    print(t1+t2)

    引入其它lua文件,如叫 test.lua,使用 require("test") 即可引用,所谓引用,会完全运行一次 test.lua。只有第一次执行,后面再次引入则不执行,dofile 与 loadfile

    函数一般是通过.来调用,但也可以用:来调用,这意味着函数可以有一个隐式的形参 self。 因此,如下写法:

         function t:f (params) body end
    

    是这样一种写法的语法糖:

         t.f = function (self, params) body end

    可以用 do ... end 来作用于一个代码段,相当于C语言中的{}作用,控制某些局部变量的作用范围。

    lua5.1中的table函数:

    t = {1,2,3,4}
    t1 = {1,3,5}
    t2 = {2,4,6}
    tt = {20,40,30,10}
    
    --输出数组
    local print_table = function(t)
        local s = '['
        for _,v in pairs(t) do 
            s = s .. v ..','
        end
        if #s ~= 1 then
            s = string.sub(s,1,#s -1)
        end
        s = s..']'
        print(s)
    end
    
    --table.concat
    local str = table.concat(t,'-',2,4)
    print('str:'..str)
    
    --table.insert
    table.insert(t,100)
    print_table(t)
    
    --table.remove
    table.remove(t)
    print_table(t)
    
    --table.sort
    table.sort(tt)
    print_table(tt)
    
    --table.maxn
    local size = table.maxn(t)
    print(size)
    
    tbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"}
    print(#tbl)
    -- 因为26和之前的数字不连续, 所以不算在数组部分内
    print(table.maxn(tbl))
    
    --table.foreachi
    --对table中每一个键值对调用一个处理函数
    t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"};
    table.foreachi(t1, function(i, v) print (i, v) end) ; --等价于foreachi(t1, print)

    180.167.2.131

    nil 表示空类型

    Lua的数据类型分为booleanstring umber able

    table是字典,但索引是从1开始。

    通过 type() 可以获取变量的类型

    默认变量都是全局变量,申明局部变量要用local 

    运算符很少,没有自增自减,只有+-*/%

    关系运算符只有 <= < > >= ==

    逻辑运算符 and or not 

    i = 0
    while i < 5 do
    print(i)
    i = i + 1
    end

    i = 0
    repeat
    print(i)
    i = i + 1
    until i > 5

    --Lua里只有break,没有continue,需要注意
    for index = 1,100,2 do
    print(index)
    if index >= 50 then
    break
    end
    end

    function add(num1,num2)
    return num1 + num2
    end
    print(add(1,2))

    在 Unity 里使用 Lua 时,调试是一个比较麻烦的问题,可以使用 ZeroBrance Studio 工具,将其安装目录下的 lualibsmobdebugmobdebug.lua 文件复制到 lua 项目根目录下,然后在需要调试的 lua 脚本第一行加上: require('mobdebug').start()。

    再开启 ZeroBrance Studio 的DEBUG服务器,再运行 Unity 工程就好了,如果调用了该调试的 lua 脚本,则会断在此处。

    调试完之后,千万要先在 ZeroBrance Studio 运行完,才能终止 Unity项目,千万不可直接停止 ZeroBrance Studio 的 Debug 服务器,否则 Unity会意外退出。

    元表与元方法:

    不可以改变除表类型之外的值的元表,除非通过C API。

    local t = {}
    function add(a, b)
        local sum = 0
        for _, v in pairs(a) do 
            sum = sum + v 
        end
        for _, v in pairs(b) do 
            sum = sum + v 
        end
        return sum
    end
    t.__add = add
    
    local t1 = {1,2,3}
    local t2 = {4,5,6}
    setmetatable(t1,t)
    setmetatable(t2,t)
    assert(t == getmetatable(t1))
    assert(t == getmetatable(t2))
    
    print(t1+t2)
  • 相关阅读:
    AcWing 102. 最佳牛围栏
    AcWing 105 七夕祭
    AcWing 122 糖果传递
    AcWing 113. 特殊排序
    AcWing 107. 超快速排序
    AcWing 106. 动态中位数
    【oracle/sqlplus】修改glogin.sql以在sqlplus提示符中显示用户和服务名
    【Java/jdbc/oracle】将两Timestamp字段的差值变成时分秒毫秒的形式
    【java/math】位运算判断奇数和取余运算判断奇数的差别
    【JDBC/Metadata】如何在Java程序中获取表的主键们(包括单主键、联合主键和无主键)
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/4960529.html
Copyright © 2020-2023  润新知