엄격 모드에서의 Nil 안정성
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨. 73개 중 71번째.
가장 흔한 Lua 충돌은 "attempt to index nil"입니다. 값이 존재한다고 가정한 코드에서 실제로는 값이 존재하지 않았을 때 발생합니다. Luau의 해답은 nil 규율입니다. --!strict 아래에서는 일반적인 string이 절대로 nil일 수 없습니다. nil이 실제로 가능한 경우에는 ?를 사용해 타입에 이를 명시해야 합니다:
--!strict
local nickname: string? = nil -- ok: string 또는 nil
local username: string = nil -- ✗ 엄격 모드에서 타입 오류이 규율은 양방향으로 적용됩니다. string?이 주어지면, nil이 아님을 확인하기 전까지 strict mode는 이를 string으로 사용하는 것을 허용하지 않습니다. 표준 도구는 일반적인 비교이며, 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) 이후 검사기는 해당 스코프의 나머지 부분에서 x를 nil이 아닌 것으로 처리하며, 런타임에서는 assert가 일찍, 즉 잘못된 가정이 발생한 지점에서 충돌합니다. 따라서 훨씬 나중의 어딘가에서 충돌하는 일을 피할 수 있습니다.
그 결과, 검사기는 "누락될 수 있는" 모든 값을 편집하는 동안 처리하도록 강제하며, 런타임 오류는 아예 발생하지 않습니다.
챌린지
쉬움누락될 수 있는 사용자 프로필 필드를 처리하세요. 파일을 --!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) 과제의 일곱 가지 테스트 호출을 출력하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Luau 소개의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러