2010-05-18 2 views

답변

3

:

setmetatable (메타 테이블 테이블은)

주어진 테이블의 메타 테이블을 설정합니다. 당신은 userdata 루아에서 무엇 "루아 말할 수 없다"

을 (당신은 C.에서 루아에서 을 다른 유형의 메타 테이블을 변경할 수 없습니다). metatable을 지정하거나 C API를 사용하여 바인드 된 함수 호출을 통해 조작해야합니다. 자세한 내용은 chapter 28.1 of Programming in Lua (Pil)을 참조하십시오.

0

userdata의 정의는 루아가 무엇인지 알지 못하거나 가질 수 없다는 것입니다. 그것은 귀하의 데이터입니다 - 귀하의 문제입니다. 조작하고 싶다면 C 함수를 호출해야합니다 (연산자 오버로드는 메타 테이블 설정에서 사용 가능함).

+0

루아가 알아야한다고 말하지 않습니다. 나는 그것을 할 수 없다는 것을 알고 있지만, SWIG가 뭔가를 말할 수는 없습니까? –

+0

SWIG는 기본 API에서 사용 가능한 동작 만 수행 할 수 있으며 소스 또는 언어를 다시 쓸 수 없습니다. lua_touserdata가 void *를 반환하면, SWIG가 내부의 별도 시스템을 사용하여 자동으로이 결과를 처리하고 올바른 유형을 전달하지 않는 한 void * 만 얻을 수 있습니다. – Puppy

-1

void 포인터가 가리키는 데이터 유형에 대해 SWIG에 알리십시오. SWIG가 타입을 알고 있다면 Lua 측이 개별 데이터 필드를 액세스하고 수정할 수있는 적절한 메타 테이블이 첨부 된 userdata으로 루아에 전달할 것이다 (클래스 인 경우 메소드를 호출한다) .

이것은 SWIG에게 라이브러리가 필요로하지 않는 데이터 유형에 대해 이야기하는 것을 의미 할 수 있지만 장기적으로는 노력해야 할 가치가 있습니다.

모든 루아는 메타 데이터에 어떤 유형의 사용자 데이터가 들어 있는지 알고 있습니다. 두 개의 userdata 값은 동일한 메타 테이블을 갖는 경우 동일한 유형입니다. 그 메타 테이블은 루아 측에서 그 콘텐트에 대한 모든 액세스를 중재 할 책임이 있으며, 일반적으로 C로 구현 된 메소드로 구성되어 있습니다. 그런 metatable이 없다면, 루아 측은 오직 불투명 한 blob로만 userdata을 처리 할 수 ​​있습니다.