## 模块
Lua中有一个叫`module`的公有函数,此函数的作用是将一组变量和函数打包在一个模块名下,便于其他文件`require`。但是这个函数受到了诸多的[指责](http://lua-users.org/wiki/LuaModuleFunctionCritiqued),原因是其会创建一个公共变量,并且这个公共变量中的所有细节都会暴露出来。这其实十分不符合面向对象的规范。
以下有一种办法可以避免这个问题,即不采用`module`函数进行打包。
~~~
-- hello/mytest.lua
local M = {} -- 私有变量
local function test() print(123) end
function M.test1() test() end
function M.test2() M.test1(); M.test1() end
return M -- 关键
~~~
以下是导入此模块的方法。
~~~
local MT = require "hello.mytest"
MT.test2()
~~~
Lua内没有类这个变量类型,但是通过Lua的`metatable`可以轻松实现类的继承,多态等等特性。关于Lua中类的实现原理,请参考我之前写的这篇博客:[Lua中实现类的原理](http://wuzhiwei.net/lua_make_class/)。