패키지
function new()
local i = 0
return function()
i = i + 1
return i
end
end
local new1 = new()
print(new1())
print(new1())
출력:
1
2
위의 코드에서 new 함수는 하나의 함수를 되돌려줍니다. 이 되돌려주는 익명 함수는 패키지 조합 부분의 함수이고 i는 비국부 변수입니다.다음 예를 살펴보겠습니다.
function test(num)
local function output()
print(num)
end
return output
end
local fun1 = test(10086)
fun1()
local fun2 = test(10000)
fun2()
여기에fun1과fun2의 함수체는 모두 output의 함수체이지만 출력은 다르다.fun1과 fun2는 사실상 두 개의 패키지이기 때문에 그들은 모두 국부 변수num의 독립적인 실례를 가지고 있다.사실 루아는 함수를 컴파일할 때 함수체에 대응하는 가상 기기 명령, 함수에 사용되는 상량값과 디버깅 정보를 포함하는 원형을 생성한다.실행할 때,lua가 함수를 실행할 때마다 그는 새로운 데이터 대상을 만듭니다. 함수 원형의 인용과 모든upvalue 인용으로 구성된 그룹을 포함하고 이 데이터 대상은 패키지입니다.이를 통해 알 수 있듯이 함수는 번역기의 개념이고 패키지를 닫을 때의 운행기의 개념이다.
비국부 변수는 실제적으로 값이 아닌 변수를 가리킨다. 이런 변수는 내부 함수 간에 공유할 수 있다. 즉, upvalue는 패키지 간에 데이터를 공유하는 방법을 제공한다.다음 예제를 참조하십시오.
function share(n)
local function fun1()
print(n)
end
local function fun2()
n = n + 1
end
return fun1,fun2
end
local f1,f2 = share(10086)
f1()
f2()
f1()
f2()
f1()
출력:
10086
10087
10088
f1, f2는 모두 패키지입니다. 그들은 비국부 변수 n을 공유했습니다. 루아는 두 패키지의 비국부 변수가 현재 창고에 있는 같은 변수를 가리키는 것을 발견했을 때 하나의 복사본만 생성한 다음에 이 두 패키지가 이 복사본을 공유하도록 합니다. 이렇게 하면 임의의 패키지가 이 비국부 변수에 대한 수정이 다른 패키지에 영향을 줄 수 있습니다.
패키지를 만들 때 그의 비국부 변수가 창고에 없는 경우도 있다. 이것은 내장 함수가 더 외주 함수의 국부 변수를 인용할 수 있기 때문이다. 다음과 같다.
function test(n)
local function fun()
local function inner1()
print(n)
end
local function inner2()
n = n + 1
end
return inner1,inner2
end
return fun
end
local t = test(10086)
local f1,f2 = t()
f1()
f2()
f1()
local g1,g2 = t()
g1()
g2()
g1()
f1()
출력:
10086
10087
10087
10088
10088
출력에서 알 수 있듯이 패키지 f1, f2, g1, g2는 모두 같은 upvalue가 있습니다. 이것은 inner1, inner2를 만들 때 창고에서 n의 흔적을 찾지 못하고 패키지 fun의 upvalue를 직접 사용하기 때문입니다.t=test(10086) 이후, t이 패키지는 n을 잘 저장하였을 것입니다. 이후 f1, f2가 현재 창고에서 n을 찾지 못하면 자동으로 그들의 패키지의 upvalue 인용 그룹으로 가서 찾은 인용 값을 자신의 upvalue 인용 그룹으로 복사합니다.따라서 f1, f2, g1과 g2가 인용한 upvalue는 실제적으로 같은 변수이고 방금 기술한 검색 메커니즘은 마지막에 그들의 upvalue 인용이 모두 같은 곳을 가리키는 것을 확보했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.