루아(LUA)
메타테이블과 __index 메타메서드
JK77
2022. 1. 8. 05:13
--[[ 저는 문과이며 코딩입문자로 제 모든 글에는 오류가 있을 수 있음을 알려드립니다. 로블록스와 마이크로스튜디오로 학습 또는 교육용 게임을 만들어 보는 것이 2022년 목표입니다.

방문: 독학_YouTube, 독학_Cafe
-- ]] -- 주석 끝.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
--[[ -- 메타테이블 만들기 첫번째 방법
prototype = {x=0, y=0, width = 100, height = 100}
mt ={}
function new(o)
setmetatable(o, mt)
return o
end
mt.__index = function(_, key)
--return _[key]
return prototype[key]
end
w = new{x=10, y=20}
print(w.width)
-- 이 함수를 할당하는 부분에 있어서는 간단하게 mt.__index = prototype이라고 선언할 수 있다.
-- 이러한 선언은 빠르고 쉽게 단일 상속을 구현할 수 있다는 장점이 있으나, -- 함수를 __index메타메서드로 사용하면 좀 더 유연한 사용이 가능하다. -- 다중상속이나 캐시외에도 상속 기법을 활용하는 여러가지를 구현할 수 있다. --]]
---[==[ -- 메타테이블 만들기 두번째 방법
mytable = setmetatable({key1 = "value1"}, {
__index = function(_, key)
---[[
if key == "key2" then
return "metatablevalue"
elseif key == "width" then
return "넓이"
else
return nil
end
--]]
--return key
--return _[key]
end
})
print(mytable.key1,mytable.key2,mytable.width,mytable.height)
--[[
이 예제는 위 예제와 다르게 메타테이블을 설정하면서 동시에 __index메타메서드로 정의하고 있다.
이 예제 역시 아래와 같이 간단하게 구현할 수 있다.
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)
끝으로 끝내 찾지 못했으나 __index에 함수를 할당 할 때, _는 할당 될 임의의 테이블로 추정된다.
--]]
--]==]
|
cs |