战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

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功能, 然后将第二个加载器换成自己的加载函数, 第三,第四直接屏蔽

posted on 2014-04-16 20:29 战魂小筑 阅读(7307) 评论(0)  编辑 收藏 引用 所属分类: 脚本技术C++/ 编程语言

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理