Step By Step(Lua模块与包)
?从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块。从使用者的角度来看,一个模块就是一个程序库,可以通过require来加载,之后便得到一个类型为table的全局变量。此时的table就像名字空间一样,可以访问其中的函数和常量,如: 1 require "mod" 2 mod.foo() 3 local m2 = mod24 local f = mod2.foo 5 f()?? ??? 1. require函数: 1 --将模块名设置为require的参数,这样今后重命名模块时,只需重命名文件名即可。 2 local modname = ... 3 local M = {} 4 _G[modname] = M 5 6 M.i = {r = 0,i = 1} 定义一个模块内的常量。 7 function M.new(r,i) return {r = r,i = i} end 8 function M.add(c1,c2) 9 return M.new(c1.r + c2.r,c1.i + c2.i) 10 11 12 function M.sub(c1,c2) 13 return M.new(c1.r - c2.r,c1.i - c2.i) 14 15 返回和模块对应的table。16 return M ??? 模块设置和初始化。这一点和上例一致。 6 声明这个模块将会用到的全局函数,因为在setfenv之后将无法再访问他们,因此需要在设置之前先用本地变量获取。local sqrt = mat.sqrt
9 local io = io
10
11 在这句话之后就不再需要外部访问了。12 setfenv(1,M)
13
后面的函数和常量定义都无需模块限定符了。15 i = {r = 1}
function new(r,128)">17 function add(c1,128)">18 return new(c1.r + c2.r,128)">19 20
21 function sub(c1,128)">22 return new(c1.r - c2.r,128)">23 24 25 ??? 4. module函数: ?? ?在Lua 5.1中,我们可以用module(...)函数来代替以下代码,如: 1 2 4 package.loaded[modname] = M
5 --[[6 和普通Lua程序块一样声明外部函数。
7 --]]
8
??? 由于在默认情况下,module不提供外部访问,必须在调用它之前,为需要访问的外部函数或模块声明适当的局部变量。然后Lua提供了一种更为方便的实现方式,即在调用module函数时,多传入一个package.seeall的参数,如:
?? ?module(...,package.seeall) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |