Menu
CoddyTech

상수 테이블 동결하기

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

상수 테이블에는 한 가지 약점이 있습니다. 여전히 일반 테이블이라는 점입니다. 어디에 있는 어떤 코드든 UserRole.Admin = 99를 쓸 수 있고, 그러면 "상수"는 소리 없이 더는 상수가 아니게 됩니다.

Luau는 table.freeze로 이 허점을 막습니다. 테이블을 동결하면 런타임에 읽기 전용이 됩니다. 필드를 추가하거나 변경하거나 제거하려고 하면 오류가 발생합니다. 관용적인 방법은 테이블을 만들 때 바로 동결하는 것입니다. table.freeze는 같은 테이블을 반환하므로 바로 대입할 수 있습니다.

local Color = table.freeze({
    Red = 1,
    Green = 2,
    Blue = 3,
})

print(Color.Red) -- 1: 읽기는 평소처럼 작동합니다
Color.Gold = 4   -- ✗ 오류: 읽기 전용 테이블을 수정하려고 시도했습니다

지금까지 이 과정에서 다룬 다른 모든 것과 달리, 이는 런타임 보호입니다. 편집 시점의 경고가 아니라 쓰기 작업이 실행되는 순간 실제 오류가 발생합니다. 타입 검사기가 확인하지 못한 코드까지도 막아 줍니다.

알아 두면 좋은 두 가지 관련 기능이 있습니다. table.isfrozen(t)는 테이블이 동결되었는지를 반환하며, 동결은 얕게 적용됩니다. 즉, 중첩된 테이블은 함께 동결하지 않는 한 계속 변경할 수 있습니다. 또한 동결을 해제할 수는 없습니다. 한 번 동결된 테이블은 계속 동결된 상태로 남습니다.

동결된 상수 테이블과 매개변수용 리터럴 유니온을 함께 사용하면 Luau 열거형을 완성할 수 있습니다. 런타임에 이름이 지정된 값은 누구도 변조할 수 없고, 해당 값을 사용하는 모든 곳에서 편집 시점 검사가 이루어집니다.

challenge icon

챌린지

쉬움

아무것도 변경할 수 없는 상수 테이블을 만드세요.

  1. local Size = table.freeze({Small = 1, Medium = 2, Large = 3})을 만드세요.
  2. Size.Large와 table.isfrozen(Size)를 출력하세요.
  3. pcall(function() Size.Huge = 4 end)의 결과를 local ok에 저장하고 ok를 출력하세요.

코드 실행을 누르세요. 출력에 3, true, false가 표시됩니다.

직접 해보기

-- 1) local Size = table.freeze({...})
-- 2) print Size.Large and table.isfrozen(Size)
-- 3) 금지된 쓰기에 대해 pcall이 반환한 값을 ok에 저장하고 출력하세요

Luau 소개의 모든 레슨

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