2012-02-01 4 views
4

저는 C++ 응용 프로그램의 데이터 기술 언어로 Lua를 사용하고 있습니다. SLB 2.0을 사용하여 Lua에 바인딩 된 C++ 클래스가 많이 있습니다. 'SetPos'또는 'SetName'과 같은 메서드 바인딩이 있습니다. 필자는 'pos'또는 'name'으로 키 값이 지정된 테이블을 사용하여 위치 또는 이름을 지정합니다 (예 :). 나는 열쇠를 가져 와서 'set'을 앞에두고 메소드가 존재한다면 그것을 호출 할 수 있기를 원한다. 그게 가능하니? 그렇다면 어떤 제안입니까?루아는 대소 문자를 구별하지 않는 메소드 호출을 지원할 수 있습니까?

내 바운드 메서드는 소문자로 만들 수 있지만 대신 바인딩 된 메서드와 동일하게 유지해야한다는 것을 알고 있습니다 (즉, 내 후퇴 일 수 있음). 내 명명 표준을 기반으로 메서드 이름을 만들려고 할 수도 있지만 대소 문자를 구분하지 않으면 오류가 발생하지 않습니다.

은 메타를 사용하여 이것을 해결할 수있는 까다로운 Lua가되어야한다고 생각합니다.하지만 직접 해결할 수는 없습니다.

제안 사항?

감사합니다.

+0

저는 SLB에 익숙하지 않습니다. C++에 어떻게 든 바인딩 된 함수로 가득 찬 테이블을 가지고 있습니까? '__index' 메타 테 이블 메소드를 정의하여 테이블에서 대소 문자를 구분하지 않고 일치하는 메소드를 검색하고 리턴 할 수 있기 때문에 함수가 가득 찬 테이블을 가지고 있다면 원하는 것을 할 수 있습니다. 그렇다면 왜 당신은 이것을 필요로합니까? 루아 함수는 일반적으로 대소 문자를 구별하므로 함수를 그대로두면 아무런 문제가 없습니다. –

+2

양쪽 위치에서 정확히 같은 이름 (+/-'set' 접두어)을 사용하는 일관성 정책을 채택하고 준수 할 것을 강력하게 제안합니다. –

+0

케이스와 함께 약간 느긋하게하고 싶은 이유는 케이스에 오류가 발생하면 런타임이 얼마인지 알 수 없기 때문입니다. 분명히 쇼 스토퍼는 아니지만 좋을 것입니다. 왜 내가 처음부터 그것을하고 싶은지에 대한 이유는 (예 : 정의 배열에서) 내 루아 파일에서 변수 (name = "blah")를 가져 와서 메서드 호출 (myObj.SetName ("blah")). –

답변

6

대소 문자를 구분하지 않는 것은 루아가 처리하는 것이 아닙니다. 모든 테이블 조회 및 로컬 변수 액세스는 궁극적으로 대소 문자 구분 문자열 비교입니다.

가장 좋은 해결책은 C++과 같이 대소 문자를 구분하는 시스템을 다루고 있으며이를 처리하는 것이 가장 좋습니다.

그러나 실제로 원한다면이 작업을 수행 할 수 있습니다. 가장 간단한 방법은 함수 테이블에 이름의 모든 가능한 경우 순열을 넣는 것입니다. 그래서 함수 테이블이있을 것입니다 : 당신은 물론 테이블의 각 이름을 사용하고 케이스 순열을 기반으로 데이터를 복제하는 기능이 자동화 할 수 있습니다

["setname"] = theFunction, 
["Setname"] = theFunction, 
["sEtname"] = theFunction, 
["SEtname"] = theFunction, 
... 

.

빈 테이블 트릭과 함께 __index__newindex 메타 메서드를 사용하는 것이 더 복잡하지만 사용하기 쉬운 메커니즘입니다.

function CreateCaseInsensitiveTable() 
    local metatbl = {} 

    function metatbl.__index(table, key) 
    if(type(key) == "string") then 
     key = key:lower() 
    end 

    return rawget(table, key) 
    end 

    function metatbl.__newindex(table, key, value) 
    if(type(key) == "string") then 
     key = key:lower() 
    end 

    rawset(table, key, value) 
    end 

    local ret = {} 
    setmetatable(ret, metatbl) 
    return ret 
end 

{}을 사용하여 테이블을 만드는 대신이 함수 호출로 테이블을 만듭니다. 그렇지 않으면 테이블이 정상적으로 작동해야합니다 (분명히 구성원 액세스가 약간 느려집니다).

+0

감사합니다. 필자는 메서드 바인딩을 위해 소문자 별칭을 만들기 위해 SLB를 수정하기로 결정했습니다. 그런 다음이 클래스를 __index를 사용하여이 클래스를 찾아보고 'funcName (objectInstance, methodName)'양식을 사용하여 호출 할 수 있습니다. 데이터를 직렬화하기위한이 기능 만 필요하므로 지금은 __index 및 __newindex 함수를 수정하지 마십시오. –

관련 문제