Menu
CoddyTech

Đó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ỉ đọc

Khá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.

challenge icon

Thử thách

Dễ

Tạo một bảng hằng số mà không gì có thể thay đổi.

  1. Tạo local Size = table.freeze({Small = 1, Medium = 2, Large = 3}).
  2. In ra Size.Large và table.isfrozen(Size).
  3. Lưu pcall(function() Size.Huge = 4 end) vào local ok rồi in ra ok.

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

Tự luyện tập: Trình biên dịch Luau online