通常,Lua不会设置规则,相反会提供很多强有力的机制来使开发者有能力实现出最适应的规则。

然而,这种方法对于模块就不行了。模块系统的一个主要目标是允许以不同的形式来共享代码。

但若没有一项公共的规则就无法实现这样的共享。

  从Lua5.1版本开始,就为模块和包定义了一系列的规则。不统一的实现可能会使程序无法使用外部模块,或者编写的模块无法被外部程序使用。

从用户观点来看,一个模块就是一些用Lua或C实现的代码,通过require去加载并返回一个table。

比如,所有的标准库就是模块。就像下面的数学库:

local m = require "math"
print(m.sin(3.14))

解释器会用类似下面的代码预加载所有的标准库:

math = require "math"
string = require "sting"
...

有了这样的预加载,我们才可以使用类似math.sin这样的语法。

一个用户要调用一个模块中的函数,其中最简单的方法是:

local mod = require "mod"
mod.foo()

用户可以为这个模块命名为任何的局部名字:

loacl m  = require "mod"
m.foo()

也可以为模块中独特的函数命名:

local m = require "mod"
local f = mod.foo
f()

上述这些方法,都不需要来自于语言的显式支持,只需要使用语言现有的内容。

有一个抱怨require的普遍现象,就是它在加载模块是不能传参。比如数学库里有两个不同的选项(degree 和radians),想通过下面的代码去实现degree就不行:

--bad code
local math = require("math", "degree")

导致这个问题的原因是 require的主要目的是避免多次加载模块。不同参数去调用require会导致冲突。

如果真的想传参,可以创建一个函数去实现它:

local mod = require "mod"
mod.init(, )

当初始化函数返回模块本身的话,我们可以这样去写代码:

local mod = require "mod".init(,)

另一个选择是,让模块返回初始化函数,并且只有这个函数会返回该模块的table。

无论如何,请记住模块至始至终都只加载一次。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

Chapter 15_0 模块和包的更多相关文章

  1. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  2. Python中函数、类、模块和包的调用

    初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...

  3. Python模块和包

    模块和包是python组织代码的基本方式. 模块: python的每一个脚本文件都可称之为模块,模块的名称就是脚本的文件名.例如当我们写了一个test.py的脚本文件,则可以在同目录下的另外一个脚本m ...

  4. python模块与包的导入

    1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...

  5. python模块及包的导入

    一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...

  6. 简述Python模块和包

    我们常常会使用别人写的包,假如我们使用的是Python3.4版本,安装在windows的C盘根目录下,那么外部的包一般放在:C:\Python34\Lib\sit-packages下,此目录下有以.p ...

  7. python 深入模块和包

    模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...

  8. Python中的模块与包

    标准库的安装路径 在import模块的时候,python是通过系统路径找到这些模块的,我们可以将这些路径打印出来: >>> pprint.pprint(sys.path) ['', ...

  9. Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

随机推荐

  1. ArcEngine开发中StartEditing和StartEditOperation的区别

    背景: 最近在开发一个管道数据维护系统的新增模块,牵涉到将这个模块的数据编辑统一到整个系统的编辑处理框架内的问题:即这个系统的所有对数据产生的编辑都需要处在整个系统唯一的开始.保存.回滚编辑的入口内. ...

  2. 项目中处理android 6.0权限管理问题

    android 6.0对于权限管理比较收紧,因此在适配android 6.0的时候就很有必要考虑一些权限管理的问题. 如果你没适配6.0的设备并且权限没给的话,就会出现类似如下的问题: java.la ...

  3. iOS 消息推送证书生成方法的简单说明

    openssl x509 -in idp.flowtreasure.cer -inform der -out PushChatCert.pem openssl pkcs12 -nocerts -out ...

  4. HDU 5895 Mathematician QSC

    矩阵快速幂,欧拉定理. $g(n)$递推式:$g(n)=5g(n-1)+5g(n-2)-g(n-3)$,可以构造矩阵快速求递$n$项,指数很大,可以利用欧拉定理降幂. #pragma comment( ...

  5. 整理一些css在使用中的小技巧(进行中)

    1. 消除li排列display:inline-block的间隙 ul{ font-size:; } ul li{ display:inline-block; }

  6. js得到当前页面的url信息方法

    js得到当前页面的url信息方法:http://www.cnblogs.com/zuosong160522/p/5755615.html js获取url传递参数,js获取url?后面的参数:http: ...

  7. line-height属性详解

    line-height属性详解:http://www.cnblogs.com/dolphinX/p/3236686.html

  8. webp图片详解

    WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使 ...

  9. Struts2的通配符配置方式

    Struts2的Action类很有意思,你可以使用3种方式来实现具体的Action类: 让你的Action类继承自ActionSupport类(项目中最常用这种方式,因为ActionSupport类中 ...

  10. 编译搭建Lamp服务器

    Lamp 是目前倍受欢迎的一种网站服务器.其主要有linux+apache+mysql+php 组成.由于其组成成员都是开源免费的产品,所以被作为中小型网站服务器的选择.LZ之前在学校学linux的时 ...