模块与包
 使用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. UVALive(LA) 4487 Exclusive-OR(带权并查集)

    题意:对于n个数X[0]~X[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题,有三种信息如下: I p  v : Xp = v;    Xp 的值为v I p q ...

  2. Python_Tips[5] -> 可变数据类型作为初始化形参

    可变数据类型作为初始化形参 / Mutable Parameter as Init Formal-para 由于在Python中,没有类似C语言的static静态参数,因此当一个函数需要一个只初始化一 ...

  3. Python的并发并行[1] -> 线程[1] -> 多线程的建立与使用

    多线程的建立与使用 目录 生成线程的三种方法 单线程与多线程对比 守护线程的设置 1 生成线程的三种方法 三种方式分别为: 创建一个Thread实例,传给它一个函数 创建一个Thread实例,传给它一 ...

  4. Codeforces 825E - Minimal Labels

    825E - Minimal Labels 题意 给出 m 条有向边,组成有向无环图,输出一个 1 到 n 组成的排列,每个数只能出现一次,表示每个点的标号.如果有边 \((u, v)\) 那么 \( ...

  5. Ext分区文件恢复工具extundelete

     Ext分区文件恢复工具extundelete Ext是延伸文件系统(Extended system)的缩写.它是为Linux内核开发的第一个文件系统.它有多个版本.现在常见的是Ext3和Ext4.由 ...

  6. 尝试解答java内存问题

    在园子中看见了这个园友的问题,高手指点一下,关于编写Java程序让Jvm崩溃,恰巧这两天看了点相关的东西,也尝试了一下,下面是仁兄提出的第一个疑问,我来复现一下: package jvm; publi ...

  7. 彻底理解Javascript 中的 Promise(-------------------------------***---------------------------------)

    ES6原生提供了 Promise 对象. 到底是何方妖怪呢?打出来看看: 所谓 Promise,就是一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个 ...

  8. App Distribution Guide (二)

    Configuring Your Xcode Project for Distribution  You can edit your project settings anytime, but som ...

  9. win10 安装java

    https://jingyan.baidu.com/article/fea4511a12b158f7bb9125b9.html 一 下载java SE 官网 二设置环境变量 JAVA_HOME PAT ...

  10. Python中的*args和**kwargs的理解与用法

    一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...