Lua의 메타 테이블에 대한 Lua 연구 노트

목차

1. 블로그 소개

2. 내용

메타 테이블이란?

메타 테이블의 역할 :

메타 테이블 설정 및 가져 오기 :

테이블과 메타 테이블 간의 조회 관계 :

메타 방법의 목적 :

3. 푸시

4. 결론


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가 만들었습니다. 추천합니다! 나도 그룹!

추천

출처blog.csdn.net/Mr_Sun88/article/details/105205942