Menu
CoddyTech

Strict 모드에서의 nil 안전성

Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨. 80개 중 77번째.

Lua에서 가장 흔한 충돌은 "attempt to index nil"입니다. 값이 없는데도 있다고 가정한 코드에서 발생합니다. Luau의 해결책은 nil 규율입니다. --!strict에서는 일반 string이 절대 nil일 수 없습니다. nil일 가능성이 실제로 있다면, 타입에 ?를 붙여 명시해야 합니다.

--!strict
local nickname: string? = nil   -- 정상: string 또는 nil
local username: string = nil    -- ✗ strict 모드에서 타입 오류

이 규율은 양방향으로 적용됩니다. string?이 주어지면, nil이 아님을 확인하기 전까지는 엄격 모드에서 이를 문자열로 사용할 수 없습니다. 표준 도구는 일반 비교식이며, typeof 가드와 마찬가지로 타입 범위를 좁혀 줍니다.

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- 여기서 name은 string입니다
    end
    return "NOBODY"
end

nil이 유효한 경우가 아니라 버그일 수 있다면 assert를 사용하세요. assert(x ~= nil) 뒤에는 검사기가 해당 범위의 나머지 부분에서 x를 nil이 아닌 값으로 취급합니다. 또한 런타임에서는 잘못된 가정이 있는 지점에서 일찍 충돌하므로, 한참 떨어진 곳에서 충돌하는 일을 막을 수 있습니다.

이렇게 하면 편집하는 동안 검사기가 “누락되었을 수도 있는” 모든 값을 처리하도록 강제하고, 런타임 오류는 아예 발생하지 않습니다.

challenge icon

챌린지

쉬움

안전한 기본값이 필요할 수 있는 이름을 지정하세요.

  1. --!strict를 첫 번째 줄에 유지하세요.
  2. local function getDisplayName(fullName: string?): string을 작성해, nil이 아니면 fullName을 반환하고, 그렇지 않으면 "Anonymous User"을 반환하세요.
  3. getDisplayName("John Smith")과 getDisplayName(nil)을 출력하세요.

Run Code를 누르세요. 출력에 John Smith과 Anonymous User이 표시됩니다.

직접 해보기

--!strict
-- 1) getDisplayName(fullName: string?): string, 값이 없으면 "Anonymous User"을 사용
-- 2) "John Smith"과 nil에 대해 결과를 출력

Luau 소개의 모든 레슨

직접 연습해 보세요: 온라인 Luau 컴파일러