2017-05-16 5 views
2

표준 이진 연산자 ==,>, <, -, +, * 등으로 구현 된 루아 코드가 있습니다. 나는 허수와 같은 루아 객체를 가진 몇몇 기능을 추가하고 싶다. (특별히 허수는 아니지만, 마음 속의 대답은 여전히 ​​내가 바라는 것이다.) 나는이 연산자 중 하나의 각 인스턴스를 상수 인 숫자의 경우를 고려하는 mult (x, y)와 같은 함수로 바꾸지 않고도 코드 전체에서 원래의 연산자를 작동 시키길 원합니다. 파이썬에서, 하나는 내가 루아에서 아날로그를 찾고 있어요루아 복소수 클래스 산술

__add__,__mul__,etc. 

(익숙하지 않은 경우 here 참조)를 사용합니다. 이 기능을 염두에두고 제안 된 클래스 구조를 얻을 수 있을까요?

답변

1

여기에서 이론을 읽을 수 있습니다. Metatables
here은 복소수 구현의 예입니다. 그 예에서 일부 코드를 붙여 넣을 수 있습니다.

-- complex.add(cx1, cx2) 
-- add two numbers; cx1 + cx2 
function complex.add(cx1,cx2) 
    return setmetatable({ cx1[1]+cx2[1], cx1[2]+cx2[2] }, complex_meta) 
end 

-- complex.sub(cx1, cx2) 
-- subtract two numbers; cx1 - cx2 
function complex.sub(cx1,cx2) 
    return setmetatable({ cx1[1]-cx2[1], cx1[2]-cx2[2] }, complex_meta) 
end 

--// metatable functions 
complex_meta.__add = function(cx1,cx2) 
    local cx1,cx2 = complex.to(cx1),complex.to(cx2) 
    return complex.add(cx1,cx2) 
end 
complex_meta.__sub = function(cx1,cx2) 
    local cx1,cx2 = complex.to(cx1),complex.to(cx2) 
    return complex.sub(cx1,cx2) 
end