lua编写模块

编写模块注意的地方:

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

猜你喜欢

转载自blog.csdn.net/weixin_41966991/article/details/88763132