리터럴 유니온 Enum 사용하기
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 54번째.
리터럴 유니온은 함수 매개변수로서의 가치를 톡톡히 발휘합니다. 매개변수 타입을 유니온으로 지정하면 타입 체커가 함수가 항상 유효한 members로만 호출되도록 보장합니다:
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ 타입 오류: Direction이 아님함수 내부에서는 if/elseif 체인을 사용하여 members를 철저하게(exhaustively) 처리하세요. 타입이 input을 four개의 값으로 제한하므로, 세 개를 검사하고 else가 마지막 값을 처리하도록 하면 모든 경우를 다루게 됩니다:
local function describe(direction: Direction): string
if direction == "up" then
return "Going upward"
elseif direction == "down" then
return "Going downward"
elseif direction == "left" then
return "Turning left"
else
return "Turning right"
end
end한 가지 주의할 점: io.read()와 같이 외부에서 들어오는 문자열은 plain string 타입으로 취급됩니다. 타입 체커가 사용자가 무엇을 입력할지 알 수 없기 때문입니다. 이전에 배운 :: cast는 해당 값을 열거형 타입으로 취급하도록 알립니다:
local direction = io.read() :: Directioncast는 약속일 뿐 검사가 아닙니다. 런타임에 입력값을 검증하지 않습니다. 프로덕션 코드에서는 먼저 검증을 거쳐야 하며, 여기서는 타입이 지정된 함수가 사용자 입력을 깔끔하게 받아들일 수 있게 해줍니다.
챌린지
쉬움멤버 "up", "down", "left", "right"를 갖는 리터럴 유니온 타입 Direction을 생성하세요.
direction: Direction을 매개변수로 받아 Moving [direction]...을 출력하는 함수 move를 생성하세요.
direction: Direction을 받아 string을 반환하고, if/elseif/else를 사용하여 모든 멤버를 처리하는 함수 getMovementDescription을 생성하세요:
"up"→Going upward"down"→Going downward"left"→Turning left"right"→Turning right
io.read()를 사용하여 사용자로부터 한 줄을 읽고 ::를 통해 Direction으로 cast하세요. 그런 다음:
direction을 인자로move를call하세요.- 동일한
direction에 대해getMovementDescription의 결과를print하세요.
직접 해보기
-- 여기에 코드를 작성하세요
-- 1) Direction 타입 정의
-- 2) move와 getMovementDescription 작성 (if/elseif/else)
-- 3) 입력 읽기: local direction = io.read() :: Direction
-- 4) move 호출 후 description 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Luau 소개의 모든 레슨
7프로젝트: Typed Task Manager
프로젝트: 태스크 형태 정의하기태스크 추가 함수8Luau 방식의 Enum
Luau의 Enum 패턴테이블을 사용한 숫자 Enum유니온으로서의 문자열 Enum리터럴 유니온 Enum 사용하기상수 테이블 동결하기요약: Luau 방식의 Enum