U E D R S I H C RSS
ID
Password
Join
회화(繪畵)는 말없는 시요, 시는 말하는 그림이다. - 시모니데(Simonides)

 * 엔진제작중에 별도의 config화일을 만들고 그 안에 table 이름들을 주욱 문자열들의 리스트로 선언한다음, 한번에 모두 변수로 선언할 수 없을까 하는 생각을 해보았습니다.
  • 간단히 말하면 다음과 같은 예제입니다. 다음은 config화일의 예제이고,
stages = {"title", "maingame", "serverselect"}
  • 다음은 메인 코드입니다.
require("config")

-- 여기서 title, maingame, serverselect라는 이름의 테이블들이 생성된다.
for i,v in stages do
    loadstring(v.."={}")()
end

-- title.lua, maingame.lua, serverselect.lua를 각각 읽어들인다. 아마 각 화일내에는 각각의 테이블 내부를 선언하는 코드가 있을 것이다.
for i,v in stages do
  loadstring('require("'..v..'")')()
end
  • loadstring(...)() 이라고 적으면 주어진 문자열에 대한 임시 function을 만들고 그것을 실행하게 됩니다. dofile과는 다르게 구미에 맞게 문자열을 edit할 수 있는 장점이 있는 유용한 방법입니다.
  • loadstring()으로 동적으로 내용이 변경되는 함수도 만들수 있습니다. 루아에서의 함수는 내부적으로 버퍼에 로딩된 실행가능한 문자열에 불과하기때문에 이런 기법이 가능합니다. (아마도 루아의 최대 장점 중 하나일 수도...)
txt = 'gcinfo()'
a = loadstring('return '..txt)
a()
  • txt가 문자열이라는 점에 주목하시기 바랍니다. 물론 a도 문자열이지만, ()연산자덕분에 함수로 돌변하는 예입니다. 경험적으로 자주사용하면 코드의 상당한 혼란을 가져올 수 있으므로 유의하시기 바랍니다.
  • 마지막으로 5.0 알파에서만 테스트되었습니다. 이전 버젼에서는 가능한지 모르겠습니다만, 4.0까지는 되는 것으로 추측됩니다.
  • 단점이라면... 문자열 자체에 해당하는 함수객체와 내장 문자열 소스에 따른 gc량이 늘어난다는 점입니다. 실시간테스트에는 좋지 않겠죠.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.3571 sec