编写模块注意的地方:
1.模块名必须与文件名相同
2.创建局部表来封装模块 达到私有性 共有性
3.将局部表赋给模块名后 摆脱函数对模块名的依赖 这样改变模块名只需改变文件名即可
4.利用环境解决 函数和变量依赖局部表名的调用
5.利用环境会造成当前环境不能访问外部的全局变量 可以通过设置元表 让当前全局变量_G继承外部的_G
方法一
创建一个table 并将所有需要导出的函数放入table中 最后返回这个table,代码如下:
complex.lua
complex = {}
function complex.new(r, i)
return {r = r, i = i}
end
--定义一个常量
complex.i = complex.new(10, 20)
function complex.add(c1, c2)
return complex.new(c1.r + c2.r, c1.i + c2.i)
end
function complex.sub(c1, c2)
return complex.new(c1.r - c2.r, c1.i - c2.i)
end
return complex
别的文件可以通过require "complex"
require "test" --require 会将模块名作为形参传到被调用函数中
print(rt)
c1 = test.new(100, 200)
c2 = test.new(100, 200)
local ret = test.add(c1, c2)
print(ret.r, ret.i)
方法二 遵守模块编写注意点调整后的模块
local moduleName = ...
local M = {} --局部表封装模块
_G[moduleName] = M --摆脱函数与模块名限制
package.loaded[moduleName] = M --解决return modname的功能
setmetatable(_G,{_index = _G}) --解决可以访问外部全局变量
setfenv(1, M) --为模块提供独立的全局环境 不要通过表名写函数和变量
function new(r, i)
return {r = r, i = i}
end
i = new(10, 20)
function add(c1, c2) --可以不加表名写函数
return new(c1.r + c2.r, c1.i + c2.i)
end
function sub(c1, c2)
return new(c1.r - c2.r, c1.i - c2.i)
end