local function useModuleRequire()
--
function readOnly(t)
local proxy = {}
local mt = {
__index = t,
__newindex = function(t, k, v)
error("our moduleRequire forbid update a read-only module", 2)
end
}
setmetatable(proxy, mt)
return proxy
end
function readOnly2(t)
local mt = {
__newindex = function(t, k, v)
error("our moduleRequire forbid update a read-only module", 2)
end
}
setmetatable(t, mt)
return t
end
--模块化的require,name是模块名,bReadOnly模块设置为是否只读
local function moduleRequire(name,bReadOnly)
if not package.loaded[name] then
local loader = loadfile
if loader == nil then
error("unable to load module "..name)
end
package.loaded[name] = true
local loadRes = loader(name..".lua")
local env = {_G = _G,} --引入全局表的环境 通过_G.xxxx形式访问全局变量
local loadResWithEnv = setfenv(loadRes,env) --设置环境,让加载的文件模块化
local res = loadResWithEnv()
local env2 = env
if bReadOnly == nil then bReadOnly = true end
if bReadOnly then
env2 = readOnly2(env)
else
env2 = env
end
_G[name] = env2 --把模块变成只读
if res ~= nil then
package.loaded[name] = res
end
end
return package.loaded[name]
end
_G.originalRequire = _G.require
_G.require = moduleRequire
end
useModuleRequire()
require("myMath")
print(myMath.myadd(2,3))function myadd(a,b)
return a+b
end
local function mydec(a,b)
return a - b
end
_G.print("this is myMath end")原文:http://blog.csdn.net/oracleot/article/details/19575401