[GpGiki 대문으로]

Lua Namespace


[주의]

현재의 루아 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