模块与包
 使用require加载模块
    一个规范的模块应该返回一个table作为这个模块所有导出功能的集合
    lua里没通过任何强制性语法规则要求创建模块时反回一个table
    但最好这么做,因为大多lua的模块都是这么发布的
   --require的实现源代码
    function require(name)
        if not package.loaded[name] then
            local loader = findloader(name)
            if loader == nil then
                error("unable to load module "..name)
            end
            package.loaded[name] = true
            local res = loader(name)
            if res ~= nil then
                package.loaded[name] = res
            end
        end
        return package.loaded[name]
    end
    require的内部实现就是通过loadfile或loadlib来加载程序块
    所以加载模块就当相于把程序块看做一个函数
    然后使用模块的文件名作参数调用一次就加载完成了
    只要使用require加载过一次的模块就不会再重复加载了,除非手动把package.loaded[name]=nil
    已加载的模块记录在package.loaded的table里
    loader是一个加载器,它会从package.preload里找对应的加载函数来实施加载
    require"mod"会得到一个全局的mod变量
    local m = require"mod"可以重定义导入模块的名称
    require的加载路径如:
    ?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
    require会以模块名来替换所有"?",每个条目用";"隔开
    也就是说require只处理分号和问号
    require用于搜索lua文件的路径存放在变量package.path中
    当lua启动后便以环境变量LUA_PATH来初始化这个变量
    如果没有找到环境变量LUA_PATH就以编译时定义的一个默认常是值来初始化
    LUA_PATH里的";;"子串会替换成默认路径
    如果require找不到lua文件就会去找c程序库,路径放在package.cpath里用LUA_CPATH初始化
    在加载c程序库里如果模块名如a-b,则以b为模块加载
    如果一个模块名为mod.sub则认为sub是mod的子模块,在require时会使用配置好的分隔符替换"."
    如果mod.sub会替换为mod\sub这样就可以很容易的分目录放置了
 使用module创建模块
    手工写法
     --创建模块--------------------------------------------------------------------------------         --require会把文件名当参数传进来,用这个变量记下来就行了
      local modname = ...
 
      --创建一个local的table用于记录导出内容
      local _M = {}
 
      --导出的table就等于这个local的table
      _G[modname] = _M
 
      --有了这句就不用return _G[modname]给require了
      package.loaded[modname] = _M
 
      --设置本环境继承全局环境,不然连接print都不能用,
      --其实如果在模块中要用全局内容,可能赋给local变量然后使用
      setmatetable(_M, {__index = _G})
 
      --把这个local的table调成当前环境
      setfenv(1, _M)
 
      --模块内容 ------------------------------------------------------------------------------          --由于使用了环境,所以local根本就不会进入环境,也就不会导出了
      local function test001()
            print("test001")
      end
 
      --全局函数相当于_M.test002=function()end会导出
      function test002()
            print("test002")
      end
    内建module关键字
      --这一句把上面创建模块部分的代码都包括了,没有package.seeall就不继承全局环境                     module(...,package.seeall)
 

lua学习笔记(十)的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  3. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  4. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  5. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  7. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  8. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  9. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  10. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

随机推荐

  1. 小程序收集formid跳转后收集不到

    为了突破微信小程序模板消息限制,需收集到足够的推送码,即每次提交表单时获取到的formId.一个formId代表着开发者有向当前用户推送模板消息的一次权限.当表单组件中的属性report-submit ...

  2. CF987C Three displays【一维DP/类似最大子序列和】

    [链接]:CF987C [分析]:先求出每个s[i]后面比s[i]大的c[i]的最小值,然后枚举前两个数c(i),c(j)以及 j 后面递增且存在最小值的dp(j) [代码]: #include< ...

  3. ACM阶段总结(2016.10.07-2016.11.09)

    来这里也有一段时间了…… 总感觉自己练得不是很有效. 最近的一些行动就是不断做比赛,然后不停地补,但是感觉这样像只无头苍蝇,没有效果,学不到什么真正的东西. 最近开始打算补专题,做做codeforce ...

  4. WORDPRESS改为https部署

    1.确保你已经正确开启了httpd 2.4.6的https配置,并且配置了该网站的虚拟主机,如下所示: <VirtualHost *:443> DocumentRoot "/ap ...

  5. 洛谷——2722总分 Score Inflation

    题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类& ...

  6. 集合框架(01)Collection

    1.集合:存储对象. 对象多了用集合存,数据多了用对象存 2.数组是固定长度,集合是不固定长度:数组是相同数据类型,集合是存储不同类型的对象 3 . 4.为什么会出现这么多的容器那,因为每一个容器对数 ...

  7. FIREDAC记录SQL日志

    FIREDAC记录SQL日志 跟踪SQL日志可以方便开发的时候的程序调试.SQL日志记录会耗费服务费资源,正式部署中间件的时候,建议关闭SQL日志记录. FIREDAC通过使用TFDMoniFlatF ...

  8. [置顶] kubernetes资源对象--Horizontal Pod Autoscaling(HPA)

    概念 HPA全称Horizontal Pod Autoscaling,即pod的水平自动扩展.自动扩展主要分为两种,其一为水平扩展,针对于实例数目的增减:其二为垂直扩展,即单个实例可以使用的资源的增减 ...

  9. util.select.js

    ylbtech-JavaScript-util: util.select.js 筛选工具 1.A,JS-效果图返回顶部   1.B,JS-Source Code(源代码)返回顶部 1.B.1, m.y ...

  10. QT5.8+vs2015配置以及qt creater中出现中文乱码解决办法之一

    1.参考此文档:QT5.6+vs2015配置: 2.出现乱码问题时候 在头文件上加入: #pragma execution_character_set("utf-8") //加入这 ...