2013-10-10 3 views
2

루아에서 프로퍼티로 함수를 푸시 할 수 있습니까? 과 같이 루아에서 그들을루아 C API - 프로퍼티를 프로퍼티에 매핑하기

lua_pushcfunction(L,L_Getter); 
lua_setfield(L, -2, "GetValue");  

lua_pushcfunction(L,L_Setter); 
lua_setfield(L, -2, "SetValue");  

그리고 전화 : 지금

, 내가 그렇게 같은 필드로 밀어 가져 오기/설정 기능을 가질 수

MyObject:SetValue("NewValue") 

을 것이 가능 밀어하는 것입니다 메타 테이블이없는 C 함수에 매핑되는 속성? __index__newindex을 사용자 정의 함수에 대한 메타 테이블로 매핑 할 수 있지만 더 쉬운 방법이 있는지 궁금합니다.

MyObject.CValue = 1 
print(MyObject.CValue) 

__index__newindex없이 가능 : 궁극적으로, 나는 메타 테이블없이 다음 구문을 줄까?

+0

시도해 보셨습니까? 그것은 단지 작동해야합니다. 제공되는 'MyObject'는 테이블입니다. – lhf

+0

@lhf 그래, 그냥 필드를 함수에 매핑되기 때문에 의미가있는'function : 00XXXXXX'를 반환합니다. – Grapes

+0

@lhf 사용자 데이터의 다양한 필드에'__index '를 가리키는 메타 테이블이있는 테이블입니다. – Grapes

답변

3

메타 테이블이 없습니까? 아니요. 메타 메서드는 tbl.foo을 평가하는 함수를 호출하는 유일한 방법입니다. MyObject을 사용자 데이터로 만들 수 있지만 다시 __index 메타 메서드를 제공하려면 메타 테이블이 필요합니다.

메타 테이블을 사랑하는 법을 배우십시오. 이들은 C/Lua 통합의 중추입니다.

+0

나는 메타 테이블을 가진 코드의 작업 버전을 이미 가지고 있지만 기본적인 무언가가 빠져 있는지 궁금합니다. 틀림없이, 고마워! – Grapes

+0

하나의 노트 : 루아에서'__index' /'__newindex' 메타 메소드를 구현하는 것이 더 쉽고, C로 메타 메소드를 만드는 것보다 대응하는 C getters/setter를 호출하게하는 것이 더 쉽습니다.'__index' /'__newindex' C에서 기대하는 모든 문자열에 대한 참조를 가져 와서 문자열 비교가 아닌 객체 ID로 일치시킬 수 있습니다. – Sneftel

+0

흥미 롭습니다. 어떻게 레퍼런스를 얻을 수 있습니까? 개체 식별과 관련하여 더 많은 정보를 얻을 수있는 곳은 어디입니까? – Grapes

관련 문제