엄격 모드에서의 Nil 안정성
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 71번째.
가장 흔한 Lua 크래시는 "attempt to index nil"입니다. 이는 값이 존재한다고 가정했지만 실제로는 존재하지 않을 때 발생합니다. Luau의 해결책은 nil 규율(nil discipline)입니다. --!strict 모드에서는 일반 string이 절대로 nil이 될 수 없습니다. nil이 될 가능성이 있다면 ?를 사용하여 타입에 명시해야 합니다:
--!strict
local nickname: string? = nil -- ok: string 또는 nil
local username: string = nil -- ✗ strict 모드에서 타입 오류이 규율은 양방향으로 적용됩니다. string? 타입이 주어지면 strict 모드에서는 nil 가능성을 배제할 때까지 이를 일반 문자열로 사용하지 못하게 합니다. 표준적인 방법은 typeof 가드처럼 타입을 좁혀주는 일반 비교 연산입니다:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- 여기서 name은 string입니다
end
return "NOBODY"
endnil이 유효한 케이스가 아니라 버그여야 하는 상황에서는 assert를 사용하세요. assert(x ~= nil) 이후부터 검사기(checker)는 해당 스코프의 나머지 부분에서 x를 non-nil로 취급합니다. 런타임에서도 어설션이 잘못된 가정이 발생한 그 시점에 즉시 크래시를 발생시켜, 멀리 떨어진 곳에서 예기치 않게 터지는 것을 방지합니다.
이 방식의 장점은 코드 편집 중에 검사기가 "누락되었을 수도 있는" 모든 값을 처리하도록 강제하므로, 런타임 에러가 아예 발생하지 않는다는 점입니다.
챌린지
쉬움누락되었을 수 있는 사용자 프로필 필드를 처리합니다. 파일의 시작 부분에 --!strict를 추가하세요.
getDisplayName(fullName: string?): string—fullName이nil이 아니면fullName을 반환하고, 그렇지 않으면Anonymous User를 반환합니다.formatEmail(email: string?): string—email이nil이 아니면 소문자로 변환된 이메일(string.lower)을 반환하고, 그렇지 않으면No email provided를 반환합니다.getUserInfo(name: string?, email: string?): string— 두 함수를 모두 사용하여Name: [processed name], Email: [processed email]형식으로 반환합니다.
그런 다음 각각 한 줄에 하나씩 출력하세요:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)getUserInfo("Sarah Wilson", nil)
직접 해보기
--!strict
-- 여기에 코드를 작성하세요
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — 둘을 결합
-- 4) 작업의 일곱 가지 테스트 호출을 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.