리터럴 유니온 Enum 사용하기
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨. 73개 중 54번째.
리터럴 유니언은 function 매개변수로 사용할 때 진가를 발휘합니다. 매개변수에 유니언으로 타입을 지정하면, 체커가 해당 function이 유효한 멤버로만 호출되도록 보장합니다:
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ 타입 오류: Direction이 아님function 내부에서는 if/elseif 연쇄를 사용해 members를 빠짐없이 처리하세요. 타입이 input을 네 가지 값으로 제한하므로, 세 가지를 확인하고 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는 검사 결과가 아니라 약속입니다. 런타임에는 어떤 것도 input을 검증하지 않습니다. 실제 운영 코드에서는 먼저 검증하겠지만, 여기서는 타입이 지정된 function이 사용자 input을 깔끔하게 받을 수 있도록 해 줍니다.
챌린지
쉬움Direction 멤버 "up", "down", "left" 및 "right"를 포함하는 리터럴 유니온 타입을 만드세요.
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으로 캐스팅하세요. 그런 다음:
- direction을 사용해
move를 call하세요. - 같은 direction에 대한
getMovementDescription의 결과를 print하세요.
직접 해보기
-- 여기에 코드를 작성하세요
-- 1) Direction 타입 정의
-- 2) move와 getMovementDescription 작성 (if/elseif/else)
-- 3) 입력 읽기: local direction = io.read() :: Direction
-- 4) move 호출 후 설명 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Luau 소개의 모든 레슨
7프로젝트: Typed Task Manager
프로젝트: 태스크 형태 정의하기태스크 추가 함수8Luau 방식의 Enum
Luau의 Enum 패턴테이블을 사용한 숫자 Enum유니온으로서의 문자열 Enum리터럴 유니온 Enum 사용하기상수 테이블 동결하기요약: Luau 방식의 Enum직접 연습해 보세요: 온라인 Lua 컴파일러