Sử dụng hàm tổng quát
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 63 trên 80.
Bạn không bao giờ cho identity biết T là gì: trình kiểm tra tự suy ra. Đây là suy luận kiểu (type inference): tại mỗi vị trí gọi hàm, Luau xem đối số rồi xác định T:
local word = identity("Luau") -- T được suy ra là kiểu chuỗi (string)
local count = identity(12) -- T được suy ra là kiểu số (number)
local flag = identity(false) -- T được suy ra là kiểu luận lý (boolean)Mỗi lần gọi hàm đều độc lập: T có thể là chuỗi ở dòng này và là số ở dòng tiếp theo. Kết quả suy luận cũng an toàn như chú thích kiểu được viết thủ công: trình kiểm tra xem word là string, với tính năng tự động hoàn thành và kiểm tra lỗi đầy đủ.
Một điểm khác biệt quan trọng so với TypeScript: TS cho phép bạn ép kiểu tại vị trí gọi hàm bằng identity<number>(5). Luau không có đối số kiểu tại vị trí gọi hàm. Dòng đó không phải cú pháp đặc biệt, nên Luau đọc dấu ngoặc nhọn là phép so sánh nhỏ hơn/lớn hơn và code sẽ lỗi. Khi muốn ghi rõ kiểu, hãy chú thích kiểu cho biến:
local count: number = identity(12)Bạn có thể quan sát quá trình suy luận bằng một công cụ quen thuộc: typeof trả về tên kiểu khi chạy của một giá trị, nên print(typeof(identity(12))) in ra number: giá trị đã đi qua hàm tổng quát mà không hề thay đổi.
Thử thách
DễĐể trình kiểm tra tự xác định T ở mỗi lần gọi.
- Bên dưới hàm, lưu
identity("Oslo")vàolocal cityvàidentity(42)vàolocal floors, không thêm chú thích kiểu dữ liệu. - In ra
typeof(city), sau đó làtypeof(floors).
Nhấn Chạy mã: đầu ra hiển thị string và number.
Tự làm thử
-- Hàm (function) identity tổng quát từ bài học trước
local function identity<T>(value: T): T
return value
end
-- 1) Lấy city và floors từ các lần gọi identity, không thêm chú thích kiểu dữ liệu
-- 2) In ra typeof của từng giá trị
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ảng9Generics: cái nhìn đầu tiên
Vấn đề mà Generics giải quyếtHàm định danh tổng quátSử dụng hàm tổng quátMảng tổng quátBí danh kiểu tổng quátÔn tập: hàm tổng quátTự luyện tập: Trình biên dịch Luau online