상수 테이블 동결하기
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 열거형을 완성할 수 있습니다. 런타임에 이름이 지정된 값은 누구도 변조할 수 없고, 해당 값을 사용하는 모든 곳에서 편집 시점 검사가 이루어집니다.
챌린지
쉬움아무것도 변경할 수 없는 상수 테이블을 만드세요.
local Size = table.freeze({Small = 1, Medium = 2, Large = 3})을 만드세요.Size.Large와table.isfrozen(Size)를 출력하세요.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 소개의 모든 레슨
4함수 다루기
매개변수와 반환값의 타입 지정익명 함수의 타입 지정아무것도 반환하지 않는 함수선택적 매개변수기본 매개변수 값불리언 기본값가변 인자 함수함수 타입 정의하기복습: 타입이 지정된 함수8Luau 방식의 Enum
Luau의 Enum 패턴테이블을 사용한 숫자 Enum유니온으로서의 문자열 Enum리터럴 유니온 Enum 사용하기상수 테이블 동결하기요약: Luau 방식의 Enum직접 연습해 보세요: 온라인 Luau 컴파일러