알맹이방
Lua_Study(dofile vs loadfile vs load) 본문
dofile : 파일에서 루아 청크를 읽어 오는 작접만 처리하고 이를 실행하지는 않는다. 청크를 컴파일해서 컴파일된 청크를 함수로 반환한다.
loadfile : dofile + dofile과는 다르게 청크에 문제가 있으면 오류를 발생하지 않고 오류 코드를 반환한다. -> 사용자가 오류 처리할 수 있도록 함
간단한 작업을 할 때에는 호출 한 번으로 처리할 수 있는 dofile을 쓰는 것이 편하다.
하지만 파일의 내용을 여러 번 실행하는 경우, lodadfile을 한 번 호출하고 반환 받은 함수를 여러 번 호출하게 처리할 수 있다. 그러면 dofile처럼 여러 번 컴파일하지 않고 한 번만 컴파일 할 수 있다.
load : 청크를 문자열에서 읽어옴
f = load("i = i + 1")
i=0
f(); print(i) --> 1
f(); print(i) --> 2
매우 강력한 함수이기 때문에 사용 시에 주의해야 한다. 정말 충격적이다.
문자열을 바로 실행시키고 싶다면 아래 방법을 이용하면 된다.
load(s)()
---- 에러메세지를 보고싶다면
assert(load(s))()
하지만 load 함수는 굳이 써야 할까? 그냥 function() i=i+1 하면 될걸 왜 사용해야 하는 걸까? 그냥 일반 function 을 사용하면 한번만 컴파일 하면 되지만 load 를 사용하면 실행할 때마다 매번 컴파일해야 하는데 말이다.
그 이유는 여기에 있다.
i=32
local i=0
f = load("i=i+1;print(i)")
g=function ()
i=i+1;print(i)
end
f()
g()
----결과
33
1
함수 g는 지역변수 i를 사용했지만 f는 전역변수 i를 사용했다. load는 청크를 컴파일 할 때 항상 전역 환경을 참조한다.
load함수는 외부의 코드를 실행하려고 할 때 주로 사용된다. 예를 들어, 사용자가 함수 코드를 입력해주면 그 함수를 실행하는 프로그램에서 쓰일 수 있다.
문장(청크)가 아닌 표현식을 입력 받아서 사용하고 싶다면 assert와 return을 사용한다.
print "enter your expression:"
local l = io.read()
local func = assert(load("return "..l))
print("the value of your expression is "..func())
----load에서 반환한 함수 func는 일반 함수이므로 여러번 호출할 수 있다.
print "enter your expression:"
local l = io.read()
local func = assert(load("return "..l))
for i=1,20 do
x=i
print(string.rep("*",func()))
end
* 여기서 string.rep함수는 입력받은 문자열을 입력한 횟수만큼 복제해준다.
+ load계열 함수(load, loadfile 등)는 컴파일을 할 뿐 실행시켜주지는 않는다. 그래서
-- foo.lua
function foo(x)
print(x)
end
f = loadfile("foo.lua") --> 컴파일O, 실행X
print(foo) --> nil
f() --> 실행O, foo를 정의
foo("ok") --> ok
실행을 시켜줘야 한다.
'Study > Lua' 카테고리의 다른 글
Lua_Study(9장) 코루틴 (0) | 2022.07.14 |
---|---|
Lua_Study(8장) (0) | 2022.07.12 |
Lua_Study(pairs와 ipairs의 차이점) (0) | 2022.07.12 |
Lua_Study(6장) (0) | 2022.07.11 |
Lua_Study(5장) (0) | 2022.07.11 |
Comments