Packages:组织全局变量的命名
- complex={} --全局名complex
- function complex.new(r,i) return {r=r,i=i} end
- complex.i=complex.new(0,1)
- 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
- function complex.mul(c1,c2)
- return complex.new(c1.r*c2.r-c1.i*c2.i,c1.r*c2.i+c1.i*c2.r)
- end
- function complex.inv(c)
- local n=c.r^2+c.i^2
- return complex.new(c.r/n,-c.i/n)
- end
- return complex
私有成员Privacy:将私有部分定义为局部变量local修饰
- local P={}
- complex=P
- local function checkComplex(c)
- if not((type(c)=="table") and tonumber(c.r) and tonumber(c.i)) then
- error("bad complex number",3)
- end
- end
- function P.add(c1,c2)
- checkComplex(c1);
- checkComplex(c2);
- return P.new(c1.r+c2.r,c1.i+c2.i)
- end
- return P
- -------------------------------------------------------------------
- 方法二:将所有函数都声明为局部的,然后放到表中
- local function checkComplex(c)
- if not((type(c)=="table") and tonumber(c.r) and tonumber(c.i)) then
- error("bad complex number",3)
- end
- end
- local function new(r,i) return {r=r,i=i} end
- local function add(c1,c2)
- checkComplex(c1);
- checkComplex(c2);
- return new(c1.r+c2.r,c1.i+c2.i)
- end
- complex={
- new=new,
- add=add,
- sub=sub,
- mul=mul,
- div=div,
- }
包与文件:写一个 package 然后将所有的代码放到一个单独的文件中。然后我们只需要执行这个文件即加载 package。
- local P={}
- if _REQUIREDNAME==nil then
- complex=P
- else
- _G[_REQUIREDNAME]=P
- end
使用全局表:
- local P={}
- complex=P
- setfenv(1,P)
- function add(c1,c2) --自动转变成complex.add
- return new(c1.r+c2.r,c1.i+c2.i)
- end
- -------------------------------------------------------------
- local P={}
- if _REQUIREDNAME==nil then
- complex=P
- else
- _G[_REQUIREDNAME]=P
- end
- setfenv(1,P)
- -----------------------------------------------------------
- --使用继承
- local P={}
- setmetatable(P,{_index=_G})
- setfenv(1,P)
- ------------------------------------------------------------
- --声明一个局部变量来保存老的环境,外部访问要加上前缀_G
- local P={}
- pack=P
- local _G=_G
- setfenv(1,P)
- -----------------------------
- local P={}
- pack=P
- local sqrt=math.sqrt
- local io=io
- setfenv(1,P)