2011-03-03 2 views
0

아래 코드에서 __index에서 메타 테이블을 중첩하려고 시도했지만 작동하지 않습니다. 내가 원하는 것은 값이 t1 또는 t2이고 관련 값을 반환하면 그렇지 않으면 가장 안쪽의 __index에서 함수를 호출하는 것입니다. 이것이 가능한가?루아에서 중첩 메타 테이블

아래에서 x [ "hello"]는 값을 반환 할 수 있습니까? 나는 가장 바깥의 __index에서 함수를 사용할 수 있다는 것을 알았지 만, 중첩 된 메타 테이블을 사용하여 어떻게 든 이것을 할 수있을 것 같습니다.

tia.

x = { val = 3 }  -- our object 

mt = { 
    __index = { 
     t1 = 2, 
     t2 = 3, 
     __index = function (table, key) 
      print("here"..key) 
      return table.val 
     end 
    } 
    } 

setmetatable(x, mt) 
print(x["t1"]) -- prints 2 
print(x.t2) -- prints 3 
print(x["hello"]) -- prints nil??? 

이 작동하지만 메타 테이블

x = { val = 3 }  -- our object 

mt1 = { 
     t1 = 2, 
     t2 = 3 
    } 

mt = { 
     __index = function (table, key) 
      local a = mt1[key] 
      if a == nil then 
       print("here"..key) 
       a = "test" 
      end 
      return a 
     end 
} 

setmetatable(x, mt) 
print(x["t1"]) 
print(x.t2) 
print(x["hello"]) 

답변

1

및 집에서 따라 다니는 모든 사용자를 위해 여기에 중첩 된 메타 테이블 인라인이 있습니다. 알렉산더 팁을 주셔서 감사합니다.

x = setmetatable(
    { val = 3 }, 
    { 
     __index = setmetatable({ 
       t1 = 2, 
       t2 = 3 
      }, 
      { 
      __index = function (table, key) 
       print("here"..key) 
       return key 
      end 
      } 
     ) 
    } 
) 
print(x["t1"]) 
print(x.t2) 
print(x["hello"]) 
0

이 작동 함께 할 수있는 것 같다,하지만 난 그게 MT2를 선언하지 않고 할 수 있습니까?

x = { val = 3 }  -- our object 

mt2 = { 
     __index = function (table, key) 
       print("here"..key) 
      return key 
     end 
} 

mt = { 
     __index = { 
     t1 = 2, 
     t2 = 3 
     } 
} 

setmetatable(mt.__index, mt2) 
setmetatable(x, mt) 
print(x["t1"]) 
print(x.t2) 
print(x["hello"]) 
+2

'setmetatable()'호출을 중첩하면 첫 번째 인수가 반환됩니다. 또한 여기에 많은 전역 변수를 작성하면 'local'은 친구입니다. –