swig-lua를 사용하고 있습니다. 나는 루아에서 내가 호출하는 함수를 가지고 있고 그것은 포인터 (userdata)를 리턴한다. 지금이 포인터가 무엇인지는 알지만 루아에서 Lua를 어떻게 알 수 있습니까? Lua Reference Manual에서루아/스위깅 루아에서 사용자 데이터 래핑
답변
:
setmetatable (메타 테이블 테이블은)
주어진 테이블의 메타 테이블을 설정합니다. 당신은
userdata
루아에서 무엇 "루아 말할 수 없다"
을 (당신은 C.에서 루아에서 을 다른 유형의 메타 테이블을 변경할 수 없습니다). metatable을 지정하거나 C API를 사용하여 바인드 된 함수 호출을 통해 조작해야합니다. 자세한 내용은 chapter 28.1 of Programming in Lua (Pil)을 참조하십시오.
userdata의 정의는 루아가 무엇인지 알지 못하거나 가질 수 없다는 것입니다. 그것은 귀하의 데이터입니다 - 귀하의 문제입니다. 조작하고 싶다면 C 함수를 호출해야합니다 (연산자 오버로드는 메타 테이블 설정에서 사용 가능함).
void
포인터가 가리키는 데이터 유형에 대해 SWIG에 알리십시오. SWIG가 타입을 알고 있다면 Lua 측이 개별 데이터 필드를 액세스하고 수정할 수있는 적절한 메타 테이블이 첨부 된 userdata
으로 루아에 전달할 것이다 (클래스 인 경우 메소드를 호출한다) .
이것은 SWIG에게 라이브러리가 필요로하지 않는 데이터 유형에 대해 이야기하는 것을 의미 할 수 있지만 장기적으로는 노력해야 할 가치가 있습니다.
모든 루아는 메타 데이터에 어떤 유형의 사용자 데이터가 들어 있는지 알고 있습니다. 두 개의 userdata
값은 동일한 메타 테이블을 갖는 경우 동일한 유형입니다. 그 메타 테이블은 루아 측에서 그 콘텐트에 대한 모든 액세스를 중재 할 책임이 있으며, 일반적으로 C로 구현 된 메소드로 구성되어 있습니다. 그런 metatable이 없다면, 루아 측은 오직 불투명 한 blob로만 userdata
을 처리 할 수 있습니다.
루아가 알아야한다고 말하지 않습니다. 나는 그것을 할 수 없다는 것을 알고 있지만, SWIG가 뭔가를 말할 수는 없습니까? –
SWIG는 기본 API에서 사용 가능한 동작 만 수행 할 수 있으며 소스 또는 언어를 다시 쓸 수 없습니다. lua_touserdata가 void *를 반환하면, SWIG가 내부의 별도 시스템을 사용하여 자동으로이 결과를 처리하고 올바른 유형을 전달하지 않는 한 void * 만 얻을 수 있습니다. – Puppy