루아의 게터

8124 단어 lua
Lua에서 멤버 액세스는 다음과 같이 작동합니다.
  • 테이블에 키가 있는지 확인하고, 있으면 해당 값을 반환합니다
  • .
  • 테이블에 메타테이블이 있고 __index 라는 필드가 있는지 확인하십시오.
  • __index 자체가 테이블인 경우 해당 테이블에서 키를 찾습니다.
  • __index가 함수인 경우 테이블과 키를 사용하여 호출합니다.


  • 따라서 getter를 구현하는 방법은 다음과 같습니다.
  • 새 객체의 메타테이블을 액세스 권한이 있는 테이블로 설정합니다
  • .
  • 다음과 같이 __index 메서드를 구현합니다.
  • 프로토타입 테이블에 키가 있는지 확인하십시오. 기본적으로 일반 멤버 메서드가 포함되어 있습니다
  • .
  • get_ 접두사가 있는 키가 있는지 확인하고 호출합니다.


  • 예시:

    Complex = { mt = {}, prototype = {} }
    Complex.mt.prototype = Complex.prototype
    function Complex.mt.__index(table, key)
        local prototype = getmetatable(table).prototype
        local inProtoType = prototype[key]
        if inProtoType ~= nil then return inProtoType end
        local getterKey = "get_" .. key
        local getter = prototype[getterKey]
        if getter ~= nil then return getter(table) end
        return nil
    end
    
    function Complex:new(o)
        o = o or {}
        local result = {}
        result.re = o.re or 0
        result.im = o.im or 0
        setmetatable(result, self.mt)
        return result
    end
    
    function Complex.mt:__tostring()
        return "Complex(" .. self.re .. " + " .. self.im .. "i)"
    end
    
    function Complex.mt:__add(o)
        o = o or {}
        local re = o.re or 0
        local im = o.im or 0
        return Complex:new { re = self.re + re, im = self.im + im }
    end
    
    function Complex.prototype:get_magnitude()
        return math.sqrt(self.re ^ 2 + self.im ^ 2)
    end
    
    local z = Complex:new { re = 1, im = 3 }
    local w = Complex:new { re = 2, im = 1 }
    
    print(z, w)
    
    print(z + w)
    
    print((z + w).magnitude)
    


    산출:

    Complex(1 + 3i) Complex(2 + 1i)
    Complex(3 + 4i)
    5.0
    

    좋은 웹페이지 즐겨찾기