목차
1. 블로그 소개
이 기사는 Lua 연구 노트로 Lua 메타 테이블의 관련 내용에 대해 설명합니다. 주요 내용은 메타 테이블이란 무엇이며 메타 테이블을 사용하는 방법과 일부 메타 메서드의 목적을 포함합니다. 지식 포인트는 루키 튜토리얼에서 발췌했습니다. , 독자는 루키 튜토리얼에서 루아 메타 테이블의 관련 콘텐츠로 바로 이동할 수 있으며, 블로그 게시물 하단에 포털이 있습니다.
2. 내용
메타 테이블이란?
메타 테이블은 테이블이며이 테이블에는 기본 메타 메서드 및 사용자 지정 메서드 속성이 있으며 다른 테이블의 설명으로 사용할 수 있습니다.이 테이블은 메타 테이블이라고도합니다.
메타 테이블의 역할 :
mytable = {}
mymetatable = {}
mymetatable 테이블을 mytable 테이블의 메타 테이블로 설정하면 mytable은 상속과 같은 mymetatable의 모든 속성과 메서드를 즐길 수 있습니다 .mytable에서 속성이나 메서드를 호출 할 때 찾을 수 없으면 다음으로 이동합니다. 테이블에서 일부 산술 연산이 수행되는 경우 테이블 내에서 다시 검색하면 메타 테이블에서 일부 관련 기본 메타 메서드가 트리거됩니다.
메타 테이블 설정 및 가져 오기 :
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
getmetatable(mytable) -- 这回返回mymetatable
mytable = setmetatable({},{})
setmetatable을 통해 테이블을 다른 테이블의 메타 테이블로 설정할 수 있습니다.이 메서드는 mymetatable이있는 테이블을 메타 테이블로 반환하므로 mytable = setmetatable ({}, {}) 형식으로 직접 축약 할 수 있습니다. 또한 getmetatable을 전달하여 테이블의 메타 테이블을 가져 오면이 메타 테이블은 nil이 될 수 있습니다.
테이블과 메타 테이블 간의 조회 관계 :
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
mymetatable.__index = mymetatable
mymetatable.key2 = 100
print(mytable.key2)
--------------------------输出
100
메타 테이블에는 몇 가지 기본 메타 메서드와 일부 속성이 있습니다. 이러한 메서드 속성은 모두 두 개의 아래쪽 막대 (__)로 시작합니다. 여기서 메타 테이블의 가장 중요한 기본 속성은 __index입니다. __index는 모든 데이터 유형으로 설정할 수 있습니다. 또는 테이블을 사용할 수 있습니다. 여기서는 속성을 호출 한 후 검색 순서를 강조해야합니다. 위 코드에서와 같이 mytable에서 속성 key2를 호출하면 mytable에 key2 속성이 없음을 알 수 있습니다. mytable의 메타 테이블 mymetatable로 이동하여 key2를 찾습니다. 실제로 mymetatable에서 key2를 찾는 것은 아니지만 mymetatable의 __index 속성에 있으므로 위의 __index를 mymetatable 자체로 설정하여 key2 속성을 찾을 수 있습니다. mymetatable에서
검색 순서 :
1. 먼저 mytable에 key2가 있는지 확인하고 존재하면 반환
2. mytable에 key2가 없으면 먼저 mytable에 메타 테이블이 있는지 확인하고 존재하지 않으면 종료합니다.
3. mytable에 mymetatable 메타 테이블이 있고, mymetatable의 __index에서 key2를 검색하고, 존재하면 반환하고, 존재하지 않으면 종료합니다.
메타 방법의 목적 :
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
print(mytable1 + mytable2)
위의 코드와 같이 정상적인 상황에서는 두 테이블에 대해 직접 더하기, 빼기, 곱하기, 나누기 연산을 수행 할 수없고 오류가보고되지만 메타 테이블이있는 경우 메타 테이블의 일부 메타 메서드는 다음과 같습니다. 연산자를 만날 때 트리거됩니다. 예를 들어 + 메서드는 메타 테이블에서 __add 메서드를 트리거합니다.
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
mymetatable = {}
setmetatable(mytable2,mymetatable)
function mymetatable:__add(table1,table2)
return 1
end
print(mytable1 + mytable2)
-------------------------输出
1
위의 코드에서 보듯이 테이블과 테이블의 추가 동작이 있으면 테이블에 메타 테이블이 있는지 여부를 추가 순서대로 판단하고, 메타 테이블이 있으면 메타 메소드가 있는지 여부 메타 테이블을 찾은 다음 첫 번째 A found __add 메서드를 호출하면 __add 메서드에 반환 값이 있습니다. 메타 테이블이 없거나 메타 테이블에 __add 메서드가 없으면 컴파일이 실패합니다. 계산과 관련된 메타 메서드는 다음과 같습니다. , 그리고 운영과 관련이없는 메타 방법의 일부 독자는 신인 튜토리얼을 참조 할 수 있습니다.
__더하다 | 해당 연산자 '+'. |
__보결 | 해당 연산자 '-'. |
__나는 가지고있다 | 해당 연산자 '*'. |
__div | 해당 연산자 '/'. |
__모드 | 해당 연산자 '%'. |
__unm | 해당 연산자 '-'. |
__concat | 해당 연산자 '...'. |
__eq | 해당 연산자 '=='. |
__lt | 해당 연산자 '<'. |
__그만큼 | 해당 연산자 '<='. |
3. 푸시
Github : https : //github.com/KingSun5
초보자 튜토리얼 Lua 메타 테이블 : https://www.runoob.com/lua/lua-metatables.html
4. 결론
메타 테이블은 다양한 기능을 가지고 있습니다. 그 중 하나는 시뮬레이션 객체 지향으로 상속을 구현하는 것입니다.이 블로그는 여기에 관한 것입니다. 블로거의 글이 잘 쓰여졌다 고 생각되면 블로거에게 주목하세요. , 블로그 게시물과 마찬가지로 다른 블로그. 주요 능력은 제한되어 있습니다. 기사에 실수가 있으면 댓글을 달고 비판 할 수 있습니다.
QQ 교환 그룹 : 806091680 (중국인)
이 그룹은 CSDN 블로거 Chinar가 만들었습니다. 추천합니다! 나도 그룹!