Menu
CoddyTech

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
end

Mỗ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
end

Giờ đâ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.

challenge icon

Thử thách

Dễ

Xem phiên bản any của echo bỏ quên điều gì.

  1. Viết local function echo(value: any): any để trả về value.
  2. Lưu echo("hello") vào local result.
  3. In ra result, rồi typeof(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

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