Menu
CoddyTech

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 nil

Khai 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 User

Nế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.

challenge icon

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.

  1. Phía trên bảng, viết type Pet = {name: string, age: number}.
  2. Khai báo kiểu cho bảng: local pet: Pet = {name = "Biscuit", age = 3}.
  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

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