GaGe

Lua_Study(dofile vs loadfile vs load) 본문

Study/Lua

Lua_Study(dofile vs loadfile vs load)

Sorrel 2022. 7. 12. 11:46
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