• LUA


    lua5.2后, 官方建议大家放弃module/package机制, 这套机制对于使用者来说是方便的, 对于module的编写者简直要抓狂, 所有module后的函数对_G均不可见, 还要一个个手动在module前转成local调用. 相当反人类. 官方建议大家手动实现package机制. 本博客之前有实现过, 参考http://www.cppblog.com/sunicdavy/archive/2013/12/10/204696.html

    由于要使用protoc-gen-lua, 这东西生成出来的lua依然使用官方的module/package机制. 对于游戏项目来说, 想进行一些自定义读取, 加密等, 就变得不可能. 幸好官方在扩展上支持的还是不错的.

    参考lua5.2的官方文档http://www.lua.org/manual/5.2/manual.html#pdf-require

    require时, lua会自动根据一定的搜索规律找到加载代码的方法. 这个方法定义在package.searchers这个数组中. 一共有4个加载搜索顺序

    1. preload, 对已加载的module进行直接返回, 对应package.preload[modname]

    2. lualoader, 对lua文件进行加载, 搜索路径为package.path

    3. cloader, 对lua标准dll进行加载, 搜索路径为package.cpath

    4. croot, 官方文档说的是all-in-one加载器, 感觉很神奇, 感兴趣可以自行参考源码

    那么, 如果只需要自己的加载器, 只需要这样做:

     

      package.searchers[2] = function( name )
            print("try to load", name )
        end
        package.searchers[3] = nil
        package.searchers[4] = nil
        
        require "libtest"

        只保留preload功能, 然后将第二个加载器换成自己的加载函数, 第三,第四直接屏蔽

    转自:http://www.cppblog.com/sunicdavy/archive/2014/04/16/206610.html

     

    在使用 xlua 加载第三方库时,有时候是因为系统已经安装,但实际xlua并没有集成成功,但unity editor确能正常运行,可以将系统路径禁用:

    package.searchers[4] = nil

     

     

    Lua 中没有 continue 语法糖,在使用使用时有两种常用操作,一种是使用 repeat util ,一种是使用 goto,使用 goto 的代码更简洁一点。

    for i =1,10,1 do
        repeat 
            if(i == 5 ) then
                break
            end 
            print(i)
        until true
    end
    
    print("-------------------------")
    
    for i =1,10,1 do
        if(i == 5 ) then
            goto continue
        end 
        print(i)
        ::continue::
    end

     

  • 相关阅读:
    2020.11.6
    2020.7.15小日记
    P1536 村村通
    P1510 精卫填海
    P1020 导弹拦截
    P1164 小A点菜
    5.17练习总结
    P1135 奇怪的电梯
    P1101 单词方阵
    P1443 马的遍历
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/6932030.html
Copyright © 2020-2023  润新知