상수 테이블 동결하기
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이 됩니다. 누구도 함부로 변경할 수 없는 이름 있는 런타임 값과, 해당 값이 사용되는 모든 곳에서의 편집 시 검사를 모두 제공하는 것입니다.
챌린지
쉬움frozen 상수 Color을(를) 이름으로 하는 table을 만들고, table.freeze를 사용해 한 단계로 생성하고 동결합니다. 다음을 포함해야 합니다:
Red=1Green=2Blue=3
volume 필드가 5인 일반적인(동결되지 않은) settings table을 만듭니다.
다음 항목을 각각 별도의 줄에 출력합니다:
Color.RedColor.BlueColor가 동결되었는지 여부(table.isfrozen)settings가 동결되었는지 여부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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Luau 소개의 모든 레슨
7프로젝트: Typed Task Manager
프로젝트: 태스크 형태 정의하기태스크 추가 함수8Luau 방식의 Enum
Luau의 Enum 패턴테이블을 사용한 숫자 Enum유니온으로서의 문자열 Enum리터럴 유니온 Enum 사용하기상수 테이블 동결하기요약: Luau 방식의 Enum직접 연습해 보세요: 온라인 Lua 컴파일러