코로나의 테이블과 메타 테이블의 차이점은 무엇입니까? 메타 테이블 유형은 무엇입니까? 사용 방법은 어디에서 사용할 수 있습니까? 테이블과 메타 테이블을 사용하는 주 목적은 무엇입니까?루아의 테이블과 메타 테이블의 차이점
답변
Lua (코로나가 기반으로하는 언어)는 다른 용도로 메타 테이블을 사용합니다.
설명서의 해당 항목은 Section 2.8입니다. 좋은 자습서는 here 또는 here입니다.
메타 테이블은 다른 테이블과 같은 테이블이지만 다른 테이블 (두 테이블을 변경하기 위해 기본 테이블이라고 부름)에서 메타 테이블로 설정됩니다.
metatable에는 아무 것도 포함 할 수 있지만 특수 키 (두 개의 밑줄로 시작)는 흥미로운 것입니다. 이 표의이 키로 설정된 값은 특별한 경우에 호출됩니다. 어떤 경우가 어떤 키에 달려 있는지. 가장 흥미로운는 다음과 같습니다
__index
: 기본 테이블의 키가 고개를하지만, 존재하지 않을 때마다 사용됩니다. 여기에는 키가 대신 조회 될 테이블 또는 원래 테이블과 키가 전달 될 함수가 포함될 수 있습니다. 이것은 표 (OOP 스타일), 리디렉션, 케이스 통과, 기본값 설정 등을 위해 테이블에 메소드를 구현하는 데 사용할 수 있습니다.__newindex
: 이전에는 nil이었던 새 키가 테이블에 할당 될 때마다 사용됩니다). 그것이 테이블이라면, 그 테이블에 키가 할당 될 것입니다. 그것이 함수라면, 그 함수는 원래 테이블, 키 및 값을 전달할 것입니다. 테이블 액세스, 데이터 사전 처리, 배정 리디렉션을 제어하는 데 사용할 수 있습니다.__call
: 예를 사용하면 호출 할 함수를 설정할 수 있습니다.table()
.__add,__sub,__mul,__div,__mod
는
__concat
는 (병합을 구현하기 위해 사용된다
__unm
는 단항 연산을 구현하기 위해 사용되는 이진 연산을 구현하는데 이용된다 ..운영자)
__len
는__eq,__lt,__le
은 그 방법에 & 공동 : __index 사용할 때 알고 구현 비교
작은 일에 사용된다 (#) 길이 연산자를 구현하기 위해 사용되는, 당신은 사용해야합니다 rawget 및 rawset을 사용하여 반복적으로 메타 메서드를 호출하여 루프를 발생시키지 않도록합니다. 작은 예를 들어 :
t={1,2,3} -- basetable
mt={} -- metatable
mt.__index=function(t,k)
print("__index event from "..tostring(t).." key "..k)
return "currently unavailable"
end
mt.__newindex=function(t,k,v)
print("__newindex event from "..tostring(t).." key: "..k.." value: "..v)
if type(k)=="string" then
rawset(t,k,v:reverse())
else
rawset(t,k,v)
end
end
mt.__call=function(t,...)
print("call to table "..tostring(t).." with arguments: ".. table.concat({...},','))
print("All elements of the table:")
for k,v in pairs(t) do print(k,v) end
end
setmetatable(t,mt)
t[4]="foo" -- this will run the __newindex method
print(t[5]) -- this will run the __index method
t("foo","bar")
-- Multiple fall through example:
t={}
mt={}
mt2={}
setmetatable(t,mt) -- metatable on base table
setmetatable(mt,mt2) -- second layer of metatable
mt.__index=function(t,k) print('key '..k..' not found in '..namelookup[t]) return getmetatable(t)[k] end -- tries looking nonexistant indexes up in mt.
mt2.__index=mt.__index -- function was written portably, reuse it.
t[1]='A'
mt[2]='B'
mt2[3]='C'
namelookup={[t]="t",[mt]="mt",[mt2]="mt2"}
print(t[1],t[2],t[3],t[4])
지금 이러한하지만 바보 예, 당신은 훨씬 더 복잡한 물건을 할 수 있습니다. 예제를 살펴보고
Programming in Lua에있는 관련 장을 살펴보고 실험 해보십시오. 그리고 혼란스러워하지 마라.)
루아의 테이블은 동적 인 구조화 된 데이터를 생성하는 데 사용할 수있는 주요 데이터 유형입니다. 다른 언어는 배열, 목록, 사전 (키 - 값 저장)을 가지고 있습니다. 루아에는 테이블 만 있습니다. 당신은 예를 들어, 기본 테이블 다른 작업을 수행 할 수
local tab = {}
tab['key1'] = 'Hello' -- storing a value using a string key
tab.key2 = 'World' -- this is syntax sugar, equivalent to previous
print(tab.key1, tab['key2']) -- indexing, the syntax is interchangable
가에 추가 : 당신이 기본 테이블로 할 수있는 유일한 작업은 즉, 색인 및
tab[key]
구문을 사용하여 값을 저장하는
local v1={x=0,y=0}
local v2={x=1,y=1}
print(v1+v2)
--> stdin:1: attempt to perform arithmetic on local 'v1' (a table value)
metatable 테이블의 동작을 수정하고 테이블 추가, 곱셈, 연결 (..
) 등을 수행 할 때 수행해야 할 작업을 지정할 수 있습니다. 메타 테이블은 특수 키가있는 함수가 들어있는 테이블입니다. 메타 메소드. setmetatable()
을 사용하여 테이블에 메타 테이블을 지정할 수 있습니다. 예를 들면 :
local Vector = {} -- this will be the metatable for vectors
function Vector.__add(v1, v2) -- what to do when vectors are added
-- create a new table and assign it a Vector metatable
return setmetatable({x=v1.x+v2.x, y=v1.y+v2.y}, Vector)
end
function Vector.__tostring(v) -- how a vector should be displayed
-- this is used by tostring() and print()
return '{x=' .. v.x .. ',y=' .. v.y .. '}'
end
local v1 = setmetatable({x=1, y=2}, Vector)
local v2 = setmetatable({x=3, y=4}, Vector)
-- vectors are added and the resulting vector is printed
print(v1 + v2) --> {x=4,y=6}
더 나은 메타 테이블을 이해하려면 확실히 read the Programming in Lua chapter on metatables해야한다.
- 1. 루아의 테이블이나 메타 테이블의 "유형"을 비교할 수 있습니까?
- 2. 두 테이블의 차이점 찾기
- 3. 동일한 테이블의 레코드 차이점
- 4. 루아 메타 테이블과 메타 메소드 - 어떻게 다른 멤버 함수를
- 5. SQL 2005에서 임시 테이블과 테이블 변수의 차이점
- 6. Python 피벗 테이블의 열 차이점
- 7. 선택한 데이터베이스의 테이블과 선택한 테이블의 필드
- 8. myISAM 테이블과 InnoDB 테이블의 외래 키
- 9. 다른 테이블과 관련된 한 테이블의 데이터 삭제
- 10. InnoDB 테이블과 MyIsam 테이블의 조합 사용
- 11. 루아의 webframeworks?
- 12. 템플릿 메타 프로그래밍시 구조와 클래스의 차이점
- 13. 두 테이블의 셀 간 Excel 차이점
- 14. 루아의 현재 줄 번호
- 15. 루아의 테이블로의 문자열
- 16. 루아의 핫스왑 코드
- 17. 루아의 과제 혼란
- 18. 루아의 C 함수 호출하기
- 19. 루아의 비동기 입력
- 20. 루아의 주문 번호
- 21. 루아의 논리 프로그래밍?
- 22. 루아의 배열 내의 배열
- 23. 루아의 전역 함수
- 24. 루아의 현재 쉘 수정
- 25. 루아의 프로세스 메모리
- 26. 루아의 WebSocket 클라이언트
- 27. 루아의 역 문자열?
- 28. 루아의 부울 테스트에 과부하가 걸릴 수 있습니까?
- 29. QA의 테이블과 프로덕션 환경 (Oracle)의 차이점 찾기
- 30. 루아의 가벼운 사용자 데이터를위한 사용 사례?
멋진 구체적인 예! –