패키지

2357 단어
폐쇄 (closure) 는 하나의 함수와 이 함수가 접근할 수 있는 비국부 변수 (upvalue) 로 구성되어 있으며, 그 중에서 비국부 변수는 국부 작용 범위 내에서 정의되지 않은 변수를 가리키지만, 동시에 하나의 전역 변수도 아니며, 주로 삽입 함수와 익명 함수에 응용된다.다음 예를 살펴보겠습니다.
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 인용이 모두 같은 곳을 가리키는 것을 확보했다.

좋은 웹페이지 즐겨찾기