2016-11-01 2 views
2

에서 원래 테이블 주소를 얻을 나는 내가 mt2 테이블의 주소가 (가변 t에서)이 루아 코드 방법 __index 내부 mt1에서루아 - 중첩 된 메타 테이블 __index 방법

local mt1 = { 
    __index = function (t, k) 
     return "key doesn't exist" 
    end 
} 

local mt2 = { 
    x = 15  
} 

setmetatable(mt2, mt1) 
mt2.__index = mt2 

local A = setmetatable({ a = 10}, mt2) 
local B = setmetatable({ b = 10}, mt2) 

print("A") 
print(A) --prints address of A 
print("B") 
print(B) --prints address of B 
print("mt2") 
print(mt2) --prints address of mt2 
print("mt1") 
print(mt1) --prints address of mt1 
print("___________") 

print(A.a) -- prints 10 
print(A.x) -- prints 15 
print(A.c) -- prints "key doesn't exist" 
print(B.b) -- prints 10 
print(A.c) -- prints "key doesn't exist" 

있습니다. 원래의 호출 표 A 또는 B의 주소를 얻을 수 있습니까?

+0

@EgorSkriptunoff 니스 ... 문제 만 지금 나는 경우 지역'MT2 = {X = 15}'내가 질문 –

+2

을 편집 한 .. Ax''에 대한, 그것은 더 이상 인쇄'15' @ EgorSkriptunoff 완벽 .. 고마워요. 대답으로 표현해주세요. –

+0

"참조"는 "주소"가 아닙니다. 주소는 수동적 인 데이터 조각 인 반면, 참조는 변수에 의해 유지되고 가비지 수집기가 객체를 도달 가능으로 표시하는 데 사용됩니다. 그리고, 아니요, 일반적으로 참조를 얻을 수 없습니다. @EgorSkriptunoff가 mt1과 같이 참조를 유지해야합니다. –

답변

1
local mt1 = { 
    __index = function (t, k) 
     return "key doesn't exist in table "..t.name 
    end 
} 

local mt2 = { 
    x = 15 
} 

-- setmetatable(mt2, mt1) -- we don't need this line anymore 

function mt2.__index(t, k) 
    local v = rawget(mt2, k) 
    if v ~= nil then 
     return v 
    else -- pass the original table MANUALLY instead of using nested metatabling 
     return mt1.__index(t, k) 
    end 
end 

local A = setmetatable({ a = 10, name = 'A'}, mt2) 
local B = setmetatable({ b = 10, name = 'B'}, mt2) 

print(A.a) --> 10 
print(A.x) --> 15 
print(A.c) --> key doesn't exist in table A 
print(B.b) --> 10 
print(A.c) --> key doesn't exist in table A