Đóng băng bảng hằng số
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 59 trên 80.
Bảng hằng số có một điểm yếu: nó vẫn chỉ là một bảng thông thường. Bất kỳ code nào, ở bất kỳ đâu, cũng có thể ghi UserRole.Admin = 99, khiến các “hằng số” của bạn âm thầm không còn là hằng số nữa.
Luau khắc phục điểm yếu này bằng table.freeze. Việc đóng băng khiến bảng chỉ có thể đọc trong thời gian chạy: mọi nỗ lực thêm, thay đổi hoặc xóa một trường đều gây ra lỗi. Cách dùng thông thường là đóng băng bảng ngay tại nơi tạo bảng: table.freeze trả về chính bảng đó, sẵn sàng để gán:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: đọc giá trị vẫn hoạt động như bình thường
Color.Gold = 4 -- ✗ lỗi: cố sửa đổi bảng chỉ đọcKhác với mọi thứ khác trong khóa học này cho đến nay, đây là cơ chế bảo vệ trong thời gian chạy: lỗi thực sự xuất hiện ngay khi câu lệnh ghi được thực thi, chứ không phải cảnh báo khi chỉnh sửa. Cơ chế này cũng ngăn được cả những đoạn code mà bộ kiểm tra kiểu chưa từng thấy.
Có hai điều bổ sung đáng biết: table.isfrozen(t) trả về việc một bảng có bị đóng băng hay không, và thao tác đóng băng chỉ áp dụng ở cấp nông: các bảng lồng nhau vẫn có thể thay đổi, trừ khi bạn cũng đóng băng chúng. Bạn cũng không thể mở băng: một khi đã đóng băng, bảng sẽ luôn ở trạng thái đó.
Bảng hằng số đã đóng băng kết hợp với hợp kiểu literal cho các tham số tạo nên enum Luau hoàn chỉnh: các giá trị trong thời gian chạy có tên mà không ai có thể sửa đổi, cùng với việc kiểm tra khi chỉnh sửa ở mọi nơi sử dụng chúng.
Thử thách
DễTạo một bảng hằng số mà không gì có thể thay đổi.
- Tạo
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - In ra
Size.Largevàtable.isfrozen(Size). - Lưu
pcall(function() Size.Huge = 4 end)vàolocal okrồi in raok.
Nhấn Run Code: đầu ra hiển thị 3, true và false.
Tự làm thử
-- 1) local Size = table.freeze({...})
-- 2) print Size.Large and table.isfrozen(Size)
-- 3) Lưu giá trị pcall trả về khi ghi vào nơi không được phép trong ok, rồi in ra.
Tất cả bài học trong Giới thiệu về Luau
1Bắt đầu với Luau
Luau là gì?Tại sao nên dùng Luau?Đoạn code Luau đầu tiênKiểm tra kiểu và chế độ lỗiÔn tập: Giới thiệu về Luau4Làm việc với hàm
Kiểu dữ liệu cho tham số và giá trị trả vềKiểu dữ liệu cho hàm ẩn danhHàm không trả về giá trịTham số tùy chọnGiá trị tham số mặc địnhGiá trị Boolean mặc địnhHàm có số lượng tham số thay đổiĐịnh nghĩa kiểu hàmÔn tập: hàm có kiểu dữ liệu2Kiểu dữ liệu cốt lõi
Số, chuỗi và BooleanKiểu 'any': lối thoátKiểu 'unknown'Kiểu Nil và kiểu tùy chọnSuy luận kiểu trong thực tếChú thích kiểu tường minhÔn tập: luyện tập với kiểu dữ liệu cốt lõi5Bí danh kiểu, kiểu hợp và kiểu giao
Bí danh kiểu cho kiểu nguyên thủyKiểu hợpLàm việc với kiểu hợpKiểu literalKiểu giaoKết hợp bí danh kiểuÔn tập: kết hợp kiểu nâng cao8Enums theo cách của Luau
Mẫu Enum trong LuauEnum số bằng bảngEnum chuỗi dưới dạng hợpDùng Enum hợp literalĐóng băng bảng hằng sốÔn tập: Enums theo cách của Luau3Bảng có kiểu: mảng và Map
Mảng có kiểuThêm và đọc phần tửKiểu Map là gì?Khai báo và truy cập MapDuyệt bảngBảng có cấu trúc hỗn hợpĐọc lướiTạo lướitable.unpackÔn tập: mảng và MapTự luyện tập: Trình biên dịch Luau online