2013-01-09 3 views
0

_ENV은 현재 클래스를 사용하여 싫어합니다. 저는 라틴어 종류의 루아 어를 만들려고 시도하고 있습니다. 어떤 것들은 정확하게 _ENV으로 만들 수 없지만, 훨씬 더 효율적입니다. setfenv도 비협조적이었습니다.
후속 코드는 이전 attempt to call a nil value 오류를 계속 반환합니다. 그것은 loadstring()이 점검되고있는 라인 20과 메인 덩어리에서 __latin() 함수를 호출하는 라인 23을 지정합니다.루아의 _ENV 및 클래스는 호환되지 않습니다.

function __latin(code) 
    __predecessor = [===[ 
    function typographia(value) 
     print(value); 
    end 

    chorda = {}; 
    chorda.__index = chorda; 

    function chorda.sub(chorda, cChorda, fChorda) 
     return string.sub(chorda, cChorda, fChorda); 
    end 
    function chorda:sub(chorda, cChorda, fChorda) 
     return string.sub(chorda, cChorda, fChorda); 
    end 

    --[[ define values --]] 
    _ENV = {salve="Salve, munde!",typographia=typographia,print=print,chorda=chorda,chorda.sub=chorda.sub}; ]===]; 
    __finalizer = __predecessor .. " " .. code; 
    local status, err = pcall(loadstring(__finalizer)); 
    print(err); 
    if (err == nil) then loadstring(__finalizer)(); end 
end 
__latin('typographia(salve); chorda.sub(salve, 1, 3);'); 

답변

2

당신은 (그래서 당신은 nilpcall 전화하는거야)loadstring 때문에 반환 nil"는 전무 값을 호출하는 시도"를 받고 있습니다. 당신이 컴파일하고있는 코드 (__predecessor가) 유효하지 않은 루아가 포함되어 있기 때문에 loadstring은 nil을 반환 :

_ENV = { 
    chorda.sub = chorda.sub -- can't do this 
} 

을 참고하십시오 loadstring/PCALL 물건 문제에 무관하다. stripped it out before posting을 본 적이 있었다면이 오류를 직접 발견했을 것입니다.

관련 문제