模块与包
 使用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. springboot的配置文件

    一.springboot配置文件值的注入 @ConfigurationProperties(prefix = "xxx") 实例代码: @Component @Configurat ...

  2. 洛谷——P1107 最大整数

    P1107 最大整数 题目描述 设有n个正整数 (n<=20), 将它们连接成一排, 组成一个最大的多位整数. 例如: n=3时, 3个整数13, 312, 343连接成的最大整数为: 3433 ...

  3. ELK集群

    kafka集群-------------------1. 下载wget http://mirror.rise.ph/apache/kafka/0.11.0.0/kafka_2.12-0.11.0.0. ...

  4. POJ 3041 Asteroids (二分图匹配)

    [题目链接] http://poj.org/problem?id=3041 [题目大意] 一个棋盘上放着一些棋子 每次操作可以拿走一行上所有的棋子或者一列上所有的棋子 问几次操作可以拿完所有的棋子 [ ...

  5. Flash3D学习计划(一)——3D渲染的一般管线流程

    一:什么是渲染管线 渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元.一个流水线是一序列可以并行和按照固定顺序进行的阶段.每个阶段都从它的前一阶段接收输入,然后把输出发给随后 ...

  6. strace 使用案例

    http://www.cnblogs.com/lixigang/articles/5512527.html

  7. Vue服务端渲染 VS Vue浏览器端渲染)

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  8. 【spring boot】集成了druid后,同样的mybatis模糊查询语句出错Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'name LIKE '%' ? '%'

    druid版本是 <!-- https://mvnrepository.com/artifact/com.alibaba/druid 数据库连接池--> <dependency> ...

  9. [ZZ]机器学习的入门

    转载自: http://www.cnblogs.com/mq0036/p/7131678.html 本篇虽不是这一个月的流水账,但是基本按照下面的思路对着一个月做了一次总结: 什么是机器学习? 机器学 ...

  10. 关于http和https淘宝支付宝跨域解决方法研究

    关于http和http跨域淘宝解决方式研究: http://buyer.trade.taobao.com/trade/pay.htm?spm=a1z01.2.3.4.0.wZAGp9&bizO ...