2010-06-25 3 views
3

나는 Lua에 다소 익숙하다. (아직 많이하지는 않았지만) 나는 메타 테이블 주위에 내 마음을 감싸려고 노력하고있다. 나는 그 (것)들을 이전에 일해달라고했다 그러나 지금 (나가 몇 달 후에) 나는 진짜로 이상한 무언가를 조우했다.Lua metamethods가 호출되지 않는다.

이 스크립트는 실행할 때 무엇을 인쇄해야합니까?

__mt = {} 

__mt.__index = function(table, key) 
    print("In __index") 
    return 99 
end 

test = {} 
test.x = 5 

setmetatable(test, __mt) 

print(test.x) 

개인적으로, 나는 그것을 실행 때마다 나는 인덱스 메타 메소드가 실행 얻을 수 있습니다 할 5 아무것도 얻을 수 없다, 그러나 99 다음 (메타 메서드에서) "__index에서"인쇄를 기대. 그냥 rawget()을 대신 사용하는 것처럼 동작합니다.

print(getmetatable(test).__index(test, "x")) 

을 추가 호기심

는 옳은 일을 할 것입니다. metatable 거기에, __index() 올바른지, 그냥 호출되지 않습니다.

이것은 버그입니까, 아니면 그냥 바보 같은 짓입니까? 나는 말할 수 없다.

답변

8

메타 메서드는 (옛 용어도 대체라고도 함)는 t.x에 액세스 할 때 키 x이 표에 존재하지 않는 경우 __index 만이라고했다. 대신 print(t.y)을 사용해보세요!

추가 : 예, 프록시 테이블을 사용합니다.

function doubletable(T) 
    local store = T or {} 
    local mt = {} 
    mt.__index = function (t, k) return store[k] and 2*store[k] end 
    mt.__newindex = store 
    return setmetatable({}, mt) 
end 

t = doubletable({a=1, b=3}) 
t.c = 7 
print(t.a, t.b, t.c) 
-- output: 2 6 14 
+0

아, 그래서 나는 바보 같은 짓을하고있었습니다. 이전에는 빈 테이블에서 사용자 지정 인덱스 메서드를 사용했습니다. 저장된 데이터의 함수를 반환하는 방법이 있습니까 (예 : 저장된 값이 2 배)? –

+1

숨겨진 테이블을 자신이 가지고있는 테이블과 같이 사용해야하고 __newindex를 덮어 쓰면 숨겨진 테이블을 가리킬 수 있습니다. 그런 식으로, 당신의 사건은 항상 꺼져 버릴 수 있습니다. 나는이 기법을 자주 사용했다. – Puppy

관련 문제