현재의 루아 5.x에서는 별로 의미가 없는 내용입니다... 그냥 참고로만 남겨 둡니다.
--류광
모듈 안의 함수, 변수들을 임의의 테이블로 로드함으로써 이름공간을 흉내내는 기법입니다.
변경:
--류광
-- load a module into a table
function loadModuleIntoTable(module_name)
-- prevent reloading
assert(not _LOADED[module_name],
'failed: already loaded module' )
local g = {}
local ns = {}
-- save global table
for k, v in _G do
g[k] = v
end
require(module_name)
for k, v in _G do
if g[k] == nil then -- something new
ns[k] = v -- put it into the result table
elseif g[k] ~= _G[k] then -- something already exists
ns[k] = _G[k] -- put newer into the result table
_G[k] = g[k] -- restore original one
end
end
return ns
end
사용 예:
-- module.lua
function func1()
print('func1!')
end
var1 = 10
--------------
lua
>mymodule = loadModuleToNamespace('module.lua')
>mymodule.func1()
func1!
>print(mymodule.var1)
10
> func1()
stdin:1: attempt to call global `func1' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
>print(var1)
nil
그나저나 모듈의 함수가 모듈 안의 변수를 참조하는 경우에는 쓸모가 없을 것 같습니다. 모듈의 func1이 모듈의 var1을 참조하는 경우, ns라는 테이블로 로드하면 ns:func1이 var1을 참조하게 되는데 var1은 ns:var1이 되어버렸으니 존재하지 않는 변수를 참조하게 되니까요... 어떤 '상태 없는' 함수들의 라이브러리를 이름공간에 집어 넣는다는 차원에서 사용하는 걸로 만족해야 할 것 같습니다. --류광
| 제일 위로 |
| 최종 수정 일시: 12월 28일(2006년) 05:49 PM 편집 | 정보 | 차이 | 비슷한 페이지 DebugInfo |
| 유용한 페이지들: 분류 분류 | 자유로운 연습장 SandBox | 무작위 페이지들 RandomPages | 인기있는 페이지들 MostPopular |