최고의 루아 테이블 요소 (메타) 튜토리얼 2024년, 이 튜토리얼에서는 __index 요소 방법,__newindex 요소 방법,테이블에 대한 연산자를 추가,__call 요소 방법,__toString 요소 방법,를 배울 수 있습니다.
루아 테이블에서는 값을 얻기 위해 해당 키 값을 액세스 할 수 있지만,이 테이블에서 동작 될 수 없다.
따라서, 루아 테이블 요소 (메타)를 제공, 테이블은 우리가 해당 요소의 메소드와 연관된 각 작업의 동작을 변경할 수 있습니다.
예를 들어, 메타 테이블을 이용하여, 우리는 루아 테이블은 두 가지 작업 A + B의 합을 계산하는 방법을 정의 할 수있다.
루아 시도가 두 개의 테이블을 추가 할 때, 먼저라는 곳이 있는지 여부를 확인한 후 필드, 발견 된 경우, 해당 값을 호출 "__add"두 위안 테이블 중 하나가 있는지 확인합니다. "__add"및 기타 인스턴트 필드에 대응하는 값 (자주 함수 또는 테이블)는 "요소 방법"이다.
위안 테이블을 처리 할 수있는 매우 중요한 두 가지 기능이 있습니다 :
다음 예제에서는 지정된 테이블 요소에 대한 테이블을 설정하는 방법을 보여줍니다 :
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
위의 코드는 라인에 직접 기록 할 수 있습니다 :
mytable = setmetatable({},{})
다음은 리턴 오브젝트 메타 데이터 테이블입니다 :
getmetatable(mytable) -- 这回返回mymetatable
이는 가장 일반적으로 사용되는 메타 핵심이다.
당신이 테이블에 액세스 할 수있는 키를 전달하고, 키 값이없는 경우, 다음 루아는 메타 테이블의 테이블을 찾을 때 __index 키에 (메타 가정). __index 테이블이 포함 된 경우, 루아는 테이블에서 해당 키를 찾을 수 있습니다.우리는 대화 형 모드 뷰를 입력 루아 명령을 사용할 수 있습니다 :
$ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo 3 > t.bar nil
__index 함수가 포함되어있는 경우, 다음, 루아는 그 함수, 테이블을 호출하고 키는 함수에 매개 변수로 전달됩니다.
그렇지 않으면, 결과를 리턴 존재 테이블 요소를 볼 __index 요소법 닐이며 그것은 __index 복귀 결과가 존재하는 경우.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
인 출력의 예 :
value1 metatablevalue
분석의 예 :
MYTABLE 테이블에 할당{키 1 = "값 1"}.
MYTABLE 세트 메타 테이블 요소 방법 __index.
MYTABLE 테이블에 키 1을 찾기가 발견되면, 계속 그 요소가 발견되지 않는 반환합니다.
MYTABLE 테이블의 키 2 찾기, 발견 된 경우, metatablevalue를 돌려, 계속 찾을 수 있습니다.
메타 테이블을 분석하는 방법 __index가 함수 인 경우, 함수를 호출 어떠한 __index 방법이 없다.
우리는 위의 코드는 간단하다 쓸 수 있습니다 :
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
실제로, 세 단계를 수행 할 때, 루아 룩업 테이블 요소 규칙 :
__newindex 요소법은 테이블을 업데이트하기 위해 사용되고, __ 인덱스 테이블에 액세스하는데 사용된다.
당신이 누락 된 인덱스 테이블 할당을 줄 때, 인터프리터는 요소법을 __newindex 볼 것이다 : 당신은 지정하지 않고이 함수를 호출합니다.
다음은 응용 프로그램 __newindex 요소 방법을 보여줍니다
mymetatable = {} mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1)
출력 인 상기의 실시 예 :
value1 nil 新值2 新值1 nil
새로운 인덱스 키 (newkey) 할당 (mytable.newkey = "새 값 2"), 할당하지 않고 요소 메소드를 호출 요소 방법 __newindex을 설정 위의 테이블의 예. 그리고 기존의 인덱스 키 (키 1) 경우, 요소 방법 __newindex를 호출하지 않고, 과제를 수행합니다.
다음 예는 테이블을 업데이트 rawset 함수를 사용합니다 :
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""kovalueko"\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
출력 인 상기의 실시 예 :
new value "4"
다음 예제에서는 두 개의 테이블이 추가 작업을 보여줍니다
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 两表相加操作 mytable = setmetatable({ 1, 2, 3 }, { __add = function(mytable, newtable) for i = 1, table_maxn(newtable) do table.insert(mytable, table_maxn(mytable)+1,newtable[i]) end return mytable end }) secondtable = {4,5,6} mytable = mytable + secondtable for k,v in ipairs(mytable) do print(k,v) end
출력 인 상기의 실시 예 :
1 1 2 2 3 3 4 4 5 5 6 6
테이블에 포함 된 핵심 요소를 __add하고, 작업을 추가 할 수 있습니다. 다음 표에 해당하는 행동의 목록 :
모드 | 기술 |
---|---|
__add | 해당 연산자 '+'. |
__sub | 해당 운전자 '-'. |
__mul | 해당 운전자 '*'. |
__div | 해당 운전자 '/'. |
__mod | 해당 운전자 '%'. |
__unm | 해당 운전자 '-'. |
__concat | 해당 운전자 'ko'. |
__eq | 해당 운전자 '=='. |
__lt | 해당 운전자 '<'. |
__le | 해당 운전자 '<='. |
루아 값을 호출 할 때 __call 요소 메서드가 호출됩니다. 다음의 예는 요소의 계산 테이블을 도시하며 :
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 定义元方法__call mytable = setmetatable({10}, { __call = function(mytable, newtable) sum = 0 for i = 1, table_maxn(mytable) do sum = sum + mytable[i] end for i = 1, table_maxn(newtable) do sum = sum + newtable[i] end return sum end }) newtable = {10,20,30} print(mytable(newtable))
출력 인 상기의 실시 예 :
70
__toString 요소 방법은 출력 테이블의 동작을 수정하는 데 사용됩니다. 내용의 우리의 사용자 정의 출력 테이블의 예는 다음과 같습니다
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " ko sum end }) print(mytable)
출력 인 상기의 실시 예 :
表所有元素的和为 60
이 문서에서 우리는 좋은 우리의 코드 기능을 단순화 할 수 있습니다 요소 테이블을 알고, 그래서 루아 메타 테이블을 이해하는 것은 우리가 간단 우수한 루아 코드를 작성할 수 있습니다.