2014-05-22 2 views
2

내 프로그램에서 동일한 테이블에 동일한 이름의 두 함수가 정의되어있는 경우 내 프로그램에서 오류를 발생 시키길 원합니다. 일어나는 일은 단지 마지막 함수를 호출하고 실행하는 것입니다.루아 표에서 함수 오버라이드 (override) 방지

여기 만 샘플 코드를

Class{'Cat'} 

function Cat:meow() 
    print("Meow!") 
end 

function Cat:meow() 
    print("Mmm") 
end 

kitty = Cat:create() 
kitty:meow() 

실행의 결과입니다입니다 : "음" 대신 내가 오류 메시지 같은이 부여하고자합니다.

+0

함수 Class에 전달 된 매개 변수 –

답변

3

불행히도 __newindex은 이미 존재하는 필드에 대한 할당을 차단하지 않습니다. 따라서 이것을 수행하는 유일한 방법은 Cat을 비워두고 모든 내용을 프록시 테이블에 저장하는 것입니다.

나는 당신의 OOP 라이브러리의 본질을 모르는, 그래서 당신은 당신의 자신에이 예제를 포함해야합니다 : 이미 이름으로 테이블을 만들 메타 테이블과 기능을 작성했습니다

local Cat_mt = {} 

-- Hide the proxy table in closures. 
do 
    local proxy = {} 

    function Cat_mt:__index(key) 
    return proxy[key] 
    end 

    function Cat_mt:__newindex(key, value) 
    if proxy[key] ~= nil then 
     error("Don't change that!") 
    end 
    proxy[key] = value 
    end 
end 

Cat = setmetatable({}, Cat_mt)