通常,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. vedio_note2

    例化 for example ex_cnt ex_cnt_inst( //模块名 例化的名字 .clk(ckl_o), // . 后面是原模块的名字 括号里面是top里的名字 .rst_n(rst_n ...

  2. CodeForces 671A Recycling Bottles

    暴力. 每个人找到一个入口,也就是从回收站到这个入口走的路程由人的位置到入口的路程来替代. 因此,只要找两个人分别从哪里入口就可以了.注意:有可能只要一个人走,另一人不走. #pragma comme ...

  3. 【hihoCoder 1466】后缀自动机六·重复旋律9

    http://hihocoder.com/problemset/problem/1466 建出A串和B串的两个后缀自动机 对后缀自动机的每个状态求出sg值. 求出B串的\(sum(x)\),表示B有多 ...

  4. Android_AndroidStudio配置

    IDE降低了程序编译的门槛, 让Android程序的编译和运行变得简单易操作. 但无论Eclipse还是Android Studio, IDE都不是非常智能和可靠的, 总会出大大小小的问题. 很多时候 ...

  5. CF Round #354 Div.2

    http://codeforces.com/contest/676 A. Nicholas and Permutation 题意:有一个从1到n的数列,可以任意对调两个数字一次,问数字1和n所在位置之 ...

  6. 如何查看centos系统版本

    [root@LAMP1 config]# cat /proc/version Linux version 2.6.32-279.el6.x86_64 (mockbuild@c6b9.bsys.dev. ...

  7. php笔记(五)PHP类和对象之对象的高级特性

    对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断. class Car { } $a = ...

  8. CUDA编程入门,Dim3变量

    dim3是NVIDIA的CUDA编程中一种自定义的整型向量类型,基于用于指定维度的uint3. 例如:dim3 grid(num1,num2,num3): dim3类型最终设置的是一个三维向量,三维参 ...

  9. C#第十一天(winform)

    1.MD5 namespace MD5加密与解密 { class Program { static void Main(string[] args) { "); Console.WriteL ...

  10. mac上设置sudo不要密码

    觉得每次sudo都需要设置密码太过麻烦,于是折腾了一番,谁知走了一番弯路记录下来. 以下是网上找到的步骤 chmod u+w /etc/sudoers  给当前用户增加写权限 vi /etc/sudo ...