Cấu trúc và bảng không ràng buộc
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 42 trên 80.
Giờ đây, bạn có hai cách làm việc với bảng bản ghi: cách linh hoạt mà bạn vẫn luôn dùng trong Lua và các hình dạng được khai báo. Bạn nên dừng lại một chút để xem mỗi cách mang lại lợi ích gì.
Bảng linh hoạt chấp nhận mọi thứ. Sự linh hoạt đó phải trả giá: viết sai tên trường (user.nmae) thì bạn sẽ nhận được nil mà không hề hay biết; quên một trường thì lỗi sẽ chỉ xuất hiện ở nơi rất xa, khi chạy chương trình, trong đoạn code đầu tiên truy cập vào chỗ thiếu đó:
local user = {name = "Ana", age = 20}
print(user.nmae) -- bảng không chặt chẽ: âm thầm in ra nilKhai báo hình dạng sẽ khiến những lỗi đó xuất hiện ngay khi chỉnh sửa. Trình kiểm tra sẽ đánh dấu lỗi chính tả ngay khi bạn viết, trình soạn thảo có thể tự động hoàn thành tên trường, và khai báo type cũng đóng vai trò là tài liệu mô tả nội dung của bảng:
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ lỗi kiểu dữ liệu: không tìm thấy khóa 'nmae' trong UserNếu bạn đã dùng TypeScript, hãy lưu ý rằng Luau không có từ khóa interface: type xử lý mọi hình dạng. Luau cũng không có cơ chế “gộp khai báo”: khai báo hai kiểu dữ liệu trùng tên trong cùng một phạm vi sẽ gây ra lỗi, vì vậy mỗi hình dạng chỉ có đúng một định nghĩa.
Các hình dạng trong Luau có tính cấu trúc: mọi bảng có đúng các trường với đúng kiểu dữ liệu đều phù hợp, bất kể chúng được tạo ở đâu hay bằng cách nào. Bảng linh hoạt vẫn có ích: các script nhanh và dữ liệu thực sự động không cần hình dạng được khai báo. Tuy nhiên, với mọi dữ liệu được truyền giữa các hàm, hình dạng sẽ giúp phát hiện lỗi khi việc sửa chúng vẫn còn dễ dàng.
Thử thách
DễChuyển một bảng chưa khai báo kiểu thành bảng có cấu trúc được khai báo.
- Phía trên bảng, viết
type Pet = {name: string, age: number}. - Khai báo kiểu cho bảng:
local pet: Pet = {name = "Biscuit", age = 3}. - Bên dưới lệnh in đầu tiên, thêm
print(pet.age).
Nhấn Chạy code: đầu ra hiển thị Biscuit và 3.
Tự làm thử
-- Một bảng không bị ràng buộc: không có gì kiểm tra các trường của bảng
local pet = {name = "Biscuit", age = 3}
print(pet.name)
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 cao3Bả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à Map6Định kiểu cấu trúc bảng
Chú thích cấu trúc trực tiếpBí danh kiểu cho cấu trúcThuộc tính tùy chọnCấu trúc và bảng không ràng buộcMở rộng cấu trúcThêm phương thức vào cấu trúcPhương thức self và dấu hai chấmÔn tập: định nghĩa cấu trúc bảngTự luyện tập: Trình biên dịch Luau online