Vấn đề mà Generics giải quyết
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 61 trên 80.
Hãy tưởng tượng bạn cần một hàm chỉ trả về bất kỳ giá trị nào bạn truyền vào: một hàm đồng nhất. Với những kiểu dữ liệu bạn đã biết đến lúc này, bạn có hai lựa chọn, và cả hai đều gây phiền toái.
Lựa chọn thứ nhất: viết một bản sao riêng cho mỗi kiểu dữ liệu. Phần thân hàm giống hệt nhau, chỉ khác phần chú thích kiểu dữ liệu:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endMỗi kiểu dữ liệu mới lại cần thêm một bản sao, và khi sửa lỗi ở một bản, bạn phải sửa ở tất cả các bản còn lại. Đó chính là kiểu trùng lặp mà bạn viết hàm để tránh.
Lựa chọn thứ hai: gộp chúng thành một hàm duy nhất với kiểu any:
local function echo(value: any): any
return value
endGiờ đây, một hàm xử lý được mọi thứ, nhưng bạn phải đánh đổi tính an toàn kiểu dữ liệu. Khi bạn gọi echo("hello"), trình kiểm tra không còn biết kết quả là một chuỗi. Nó chỉ biết kiểu any, nên tính năng tự động hoàn thành không còn hoạt động và lỗi kiểu dữ liệu lọt qua: mối liên hệ giữa giá trị đầu vào và giá trị đầu ra bị mất.
Điều bạn thực sự muốn là một hàm hoạt động với mọi kiểu dữ liệu và ghi nhớ kiểu dữ liệu được dùng trong mỗi lần gọi. Đó chính là điều kiểu tổng quát (generics) mang lại, và chúng là chủ đề của chương này.
Thử thách
DễXem phiên bản any của echo bỏ quên điều gì.
- Viết
local function echo(value: any): anyđể trả vềvalue. - Lưu
echo("hello")vàolocal result. - In ra
result, rồitypeof(result).
Nhấn Chạy Code: đầu ra hiển thị hello và string.
Tự làm thử
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) In ra result và typeof(result)
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