2013-05-28 3 views
2

나는 userdata 객체를 받아들이는 함수를 가지고있다.userdata 객체에 테이블에 대한 참조를 추가하는 방법은 무엇입니까?

function Class:AttachToUserdataObject(userdataObject) 
    userDataObject.tableAttached = self 
end 

나도 같은 유저 데이터 오브젝트를 사용하고 그러나 나중에, 나는 그것을 찾을 수 없습니다 - userdataObject.tableAttached은 전무하다. userdata 객체가 아직 작동하지 않는 방식을 완전히 이해하지 못하는 것 같습니다.

모든 userdata 개체의 ID (고유 ID 보유)와 테이블에 대한 참조를 가진 전역 테이블을 만드는 것 외에 다른 방법으로 개체를 userdata에 바인딩 할 수 있습니까?

나는 그것을 가능한 한 우아하게하고 싶지만, C++ 코드에 액세스하지 않고서는 그냥 작동하면 약간의 elegancy를 희생 할 수 있다고 생각한다.

+1

[debug.setuservalue] (http://www.lua.org/manual/5.2/manual.html#pdf-debug.setuservalue) – finnw

답변

3

유저 데이터 객체는 테이블과 같은 필드가없는 루아는 기본 C 객체의 내부에 대해 전혀 지식이 없습니다. 원하는 것을 얻으려면 __index__newindex 메타 메소드를 처리해야합니다.

예를 들어 userdataObject.tableAttached = self과 같은 할당을 수행하면 __newindex 메타 메서드가 트리거됩니다. 그 안에는 메타 테이블 자체에 값을 저장하거나 (이름 충돌 가능성이 있음) 다른 테이블에 값을 저장할 수 있습니다.이 테이블 자체는 메타 테이블에 저장됩니다.

데이터를 다시 검색하려면 __index 메타 메서드를 처리해야합니다. userdata로 약간 까다로울 수 있습니다. 문제가 발생하면 알려주세요.

+0

코드 샘플을 제공하는 대신 전체 프로세스를 설명해 주셔서 감사합니다. 나는 내가하려는 일이 루아 협약을 어지럽히는 것처럼 보이기 때문에 나는 지금 탁자로 갈 것이라고 결정했다. – Nebril

2

당신은 대신 백업 약한 테이블을 사용할 수 있습니다

local _data = setmetatable({}, {__mode='k'}) 

function Class:AttachToUserdataObject(userdataObject) 
    _data[userDataObject] = self 
end 
+0

더 완벽한 예를 들어 주셨으면합니다. userdata로 작업하는 시스템을 가지고 있지만, 이제는 userdata 메타 테이블로 뒷받침되는 실제 테이블을 사용하는 것이 더 나을 것이라고 생각합니다. –

관련 문제