Menu
Coddy logo textTech

상수 테이블 동결하기

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

상수 table에는 한 가지 약점이 있습니다. 여전히 일반적인 table이라는 점입니다. 어디서든 어떤 코드든 UserRole.Admin = 99를 쓸 수 있고, 그러면 여러분의 "constants"는 조용히 더 이상 상수가 아니게 됩니다.

Luau는 table.freeze로 이 간극을 메웁니다. 동결하면 table은 런타임에서 읽기 전용이 됩니다. 필드를 추가하거나 변경하거나 제거하려는 모든 attempt는 error를 발생시킵니다. 일반적인 방식은 table을 build하는 바로 그 위치에서 동결하는 것입니다. table.freeze는 동일한 table을 반환하므로 바로 할당할 수 있습니다.

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

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

지금까지 이 과정에서 배운 다른 모든 것과 달리, 이것은 런타임 보호입니다. 편집 시 경고가 아니라 write가 실행되는 순간 발생하는 실제 error입니다. type checker가 확인하지 못한 코드까지도 보호합니다.

알아 둘 만한 두 가지 companion이 있습니다. table.isfrozen(t)는 table이 frozen인지 여부를 반환하며, 동결은 얕게 적용됩니다. 즉, 중첩된 table은 함께 동결하지 않는 한 계속 변경할 수 있습니다. 또한 동결을 해제할 수도 없습니다. 한 번 frozen 상태가 된 table은 계속 frozen 상태로 남습니다.

frozen constant table과 매개변수에 사용하는 literal union을 함께 사용하면 완전한 Luau enum이 됩니다. 누구도 함부로 변경할 수 없는 이름 있는 런타임 값과, 해당 값이 사용되는 모든 곳에서의 편집 시 검사를 모두 제공하는 것입니다.

challenge icon

챌린지

쉬움

frozen 상수 Color을(를) 이름으로 하는 table을 만들고, table.freeze를 사용해 한 단계로 생성하고 동결합니다. 다음을 포함해야 합니다:

  • Red = 1
  • Green = 2
  • Blue = 3

volume 필드가 5인 일반적인(동결되지 않은) settings table을 만듭니다.

다음 항목을 각각 별도의 줄에 출력합니다:

  1. Color.Red
  2. Color.Blue
  3. Color가 동결되었는지 여부(table.isfrozen)
  4. settings가 동결되었는지 여부
  5. pcall 내부에서 Color에 필드를 추가하려고 시도한 결과: pcall(function() Color.Gold = 4 end)를 호출하고 반환되는 boolean을 출력합니다

직접 해보기

-- 여기에 코드를 작성하세요
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, 양쪽 isfrozen 결과
-- 4) 금지된 쓰기를 pcall하고 반환된 boolean을 print
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Luau 소개의 모든 레슨

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