模块与包
 使用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. 数学【p2613】 【模板】有理数取余(费马小定理)

    题目描述 给出一个有理数 c=a/b ,求 c mod 19260817的值. 说明 对于所有数据, 0≤a,b≤10^10001 分析: 一看题 这么短 哇简单!况且19260817还是个素数!(美 ...

  2. kibana-Coordinate Map

    1. Visualize 添加图形 2. 选择图形类型  Coordinate Map 3. 选择索引 4. 设定成图的聚合字段 如果有数据,点击右上角的三角形,地图上就会有显示. 5. 保存图形

  3. 数论day1 —— 基础知识(们)

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61632537 向大(hei)佬(e)势力学(di ...

  4. [POI2014]Supercomputer

    题目大意: 给定一个$n(n\le10^6)$个结点的有根树,从根结点开始染色.每次可以染和已染色结点相邻的任意$k$个结点.$q(q\le10^6)$组询问,每次给定$k$,问至少需要染几次? 思路 ...

  5. [JZOJ3106]锻炼

    题目大意: 给你一个$n\times m(n,m\leq 50)$的网格图,其中有一个四连通的障碍物.给定起点和终点,每次你可以走到和当前位置八连通的一个方格内,问绕障碍物一圈最短要走几格? 思路: ...

  6. zlib stream

      官方帮助手册 http://www.zlib.net/manual.html   #include <stdlib.h> #include <string.h> #incl ...

  7. 八. 输入输出(IO)操作5.面向字节流的应用

    文件输入输出流 文件输入输出流 FileInputStream 和 FileOutputStream 负责完成对本地磁盘文件的顺序输入输出操作. [例 10-5]通过程序创建一个文件,从键盘输入字符, ...

  8. System.Runtime.InteropServices.COMException

    System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for compo ...

  9. IntelliJ全家桶修改terminal字体的方法

    IntelliJ IDEA 设置Terminal 窗口字体大小 我在Setting中查看了所有和Terminal字样有关的设置,都没有找到设置字体大小的方法,原来Terminal也只需要设置Conso ...

  10. Java防止SQL注入的几个途径

    java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用 PreparedStatement来代替Statement来执行SQL语句,其 ...