• LUA重难点解析


    1、元表

      元表也是一个 table,它附加在另一个 table 上,可以扩展该 table 的某些行为。

      拿 __index 来举例,它是用来扩展查找索引行为的。在查找一个 key 对应的值时,会依次经历如下规则:

      1、查找表中是否存在该索引 key,如存在,则取出相应值,如不存在则继续。

      2、查找该表的元表(如果有元表),是否存在 __index 键,如果存在 __index 键,则分两种情况:若 __index 对应的是一个函数,则调用该函数得出相应值;若 __index 对应的是一个表,则从此表中查找 key,如果不存在,则查找该表是否存在元表,如此循环。

      注意,设置元表的某项行为键时,可以将元表自身设置为相应的值,如: metaTable.__index = metaTable

    t = {userid=1,username="lua"}
    t1 = {age=20}
    t2 = { 
            __index=
                function(_t,key)        --这里的第一个参数指向被附加表
                    print(_t.username);     --"lua"
                    return #key 
                end 
        }   
    
    setmetatable(t,t1)
    print(t.age)        --nil
    t1.__index = t1
    print(t.age)        --20
    
    setmetatable(t,t2)
    print(t.age)        --3 

        所以,元表是这样一种表:它通过不同的键,为被附加表定义了不同的扩展行为。这些行为有:

    __add(a, b) --加法
    __sub(a, b) --减法
    __mul(a, b) --乘法
    __div(a, b) --除法
    __mod(a, b) --取模
    __pow(a, b) --乘幂
    __unm(a) --相反数
    __concat(a, b) --连接
    __len(a) --长度
    __eq(a, b) --相等
    __lt(a, b) --小于
    __le(a, b) --小于等于
    __index(a, b) --索引查询
    __newindex(a, b, c) --索引更新(PS:不懂的话,后面会有讲)
    __call(a, ...) --执行方法调用
    __tostring(a) --字符串输出
    __metatable --保护元表

    2、协程

      Lua 的协程和 Unity 的协程一样,并不是真正的多线程,而只是在一个线程中轮流执行。

      Lua 通过 coroutine.create(func) 来启动一个协程,刚启动的协程并不会立即工作,它处于就绪态,需要调用 coroutine.resume(co,...) 来重入启动执行(co 是 coroutine.create(func) 的返回值),然后进入 func 函数内,遇到 coroutine.yield(...) 函数来暂停进入等待态,将执行权交给协程外部程序,然后在协程外部可以再通过 coroutine.resume(co,...) 来重入协程内部之前的 yield 处继续执行,如此反复直到协程函数执行完毕。

      我们看到 coroutine.resume(co,...) 除了第一个参数指明要重入的协程之外,还可以传入其它参数,当初始化一个协程第一次 resume 时,传入的其它参数会作为协程函数的参数带入,而 coroutine.yield(...) 的参数,会传回协程外,通过 local ret,... = coroutine.resume(co,...) 来获取,注意 ret 是 bool 表示重入成功还是失败,后面的返回值才是 yield 传回的参数;而再次调用 coroutine.resume(co,...) 重入时,resume 的其它参数也会传到协程内,由 local ... = coroutine.yield(...) 来获取。

      关于 resume 和 yield 之间的数据交换非常神奇,需要理解透彻。

    3、IDE

    看上去最舒服的 IDE 是 IntelliJ IDEA,搜索 lua 插件安装,新建 LUA 项目,右键工程选择 “Open Module Settings” ,选择 SDKs 添加一个名为 lua53 的 sdk, home path 填写 lua 可执行目录,一般在 /usr/local/bin 下,classpath 填写 

    /Users/yugd/Library/Application Support/IdeaIC2017.1/Lua

    然后再选择 Libraries,同样添加一次,保存即可 

    Lua 5.3 参考手册

    http://cloudwu.github.io/lua53doc/manual.html 

  • 相关阅读:
    图像处理之基础---特征向量的 几何意义
    图像处理之基础---仿射变换
    图像处理之基础---周末戏说卷积
    图像处理之基础---内积和外积
    图像处理之基础---最小二乘积
    图像处理之基础---大话小波和卷积
    嵌入式开发之项目---遥控小车课题设计
    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 04. 中间件
    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道
    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 02. Web Host 的默认配置
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/6640392.html
Copyright © 2020-2023  润新知