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

 

posted @ 2017-06-02 10:11  轻典  阅读(478)  评论(0编辑  收藏  举报