Menu
Coddy logo textTech

산술 메타메소드 파트 2

Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 54개 중 22번째.

덧셈과 뺄셈을 바탕으로, __mul__div 메타메소드를 사용하여 테이블에 대한 곱셈과 나눗셈 동작을 정의할 수도 있습니다. 이것들은 __add__sub와 동일한 방식으로 작동하지만, */ 연산자에 반응합니다.

__mul 메타메소드는 테이블의 값을 스케일링(배율 조정)하고 싶을 때 특히 유용합니다. 예를 들어, 벡터에 숫자(스칼라라고 함)를 곱하면 각 성분에 곱해져야 합니다:

local vector = {x = 3, y = 4}

local meta = {
    __mul = function(a, b)
        local scalar = type(a) == "number" and a or b
        local vec = type(a) == "table" and a or b
        return {x = vec.x * scalar, y = vec.y * scalar}
    end
}

setmetatable(vector, meta)

local scaled = vector * 2
print(scaled.x, scaled.y)  -- 출력: 6  8

함수가 어떤 피연산자가 숫자이고 어떤 것이 테이블인지 어떻게 확인하는지 주목하세요. 이를 통해 vector * 22 * vector가 모두 올바르게 작동할 수 있습니다.

__div 메타메소드는 나눗셈에 대해 비슷하게 작동합니다:

local meta = {
    __div = function(a, b)
        return {x = a.x / b, y = a.y / b}
    end
}

setmetatable(vector, meta)

local divided = vector / 2
print(divided.x, divided.y)  -- 출력: 1.5  2

이 메타메소드들은 사용자 정의 타입에 대한 기본적인 산술 연산을 완성하여, 테이블에서 수학 연산자가 어떻게 동작하는지에 대해 완전한 제어권을 제공합니다.

challenge icon

챌린지

쉬움

x, y, 그리고 scalar를 인자로 받아 스케일링된 벡터를 포맷된 문자열로 반환하는 scaleVector 함수를 작성하세요.

주어진 좌표로 벡터 테이블을 생성하고, 스칼라 곱셈을 가능하게 하는 __mul 메타메소드가 포함된 메타테이블을 연결한 뒤, * 연산자를 사용하여 벡터에 스칼라를 곱하고 그 결과를 반환하세요.

로직:

  • 제공된 좌표로 설정된 xy 키를 가진 벡터 테이블을 생성합니다.
  • 벡터와 스칼라 사이의 곱셈을 처리하는 __mul이 포함된 메타테이블을 생성합니다.
  • __mul 함수는 어떤 피연산자가 숫자이고 어떤 것이 테이블인지 확인해야 합니다.
  • x = vec.x * scalary = vec.y * scalar를 가진 새 테이블을 반환합니다.
  • setmetatable()을 사용하여 벡터 테이블에 메타테이블을 연결합니다.
  • vector * scalar를 사용하여 벡터에 스칼라를 곱합니다.
  • 결과를 "x y" 형식(공백으로 구분된 x와 y 값)의 문자열로 반환합니다.

매개변수:

  • x (number): 벡터의 x 좌표
  • y (number): 벡터의 y 좌표
  • scalar (number): 벡터에 곱할 스칼라 값

반환값: "x y" 형식의 문자열로 된 스케일링된 벡터 (string)

치트 시트

__mul__div 메타메소드는 테이블에 대한 곱셈과 나눗셈 동작을 정의하며, */ 연산자에 반응합니다.

__mul 메타메소드는 테이블 값을 스케일링하는 데 유용합니다. 벡터에 스칼라를 곱할 때, vector * 22 * vector가 모두 가능하도록 어떤 피연산자가 숫자인지, 어떤 것이 테이블인지 확인하십시오:

local vector = {x = 3, y = 4}

local meta = {
    __mul = function(a, b)
        local scalar = type(a) == "number" and a or b
        local vec = type(a) == "table" and a or b
        return {x = vec.x * scalar, y = vec.y * scalar}
    end
}

setmetatable(vector, meta)

local scaled = vector * 2
print(scaled.x, scaled.y)  -- Output: 6  8

__div 메타메소드는 나눗셈에 대해 유사하게 작동합니다:

local meta = {
    __div = function(a, b)
        return {x = a.x / b, y = a.y / b}
    end
}

setmetatable(vector, meta)

local divided = vector / 2
print(divided.x, divided.y)  -- Output: 1.5  2

직접 해보기

function scaleVector(x, y, scalar)
    -- 여기에 코드를 작성하세요
end
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨