Phương thức self và dấu hai chấm
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 45 trên 80.
Viết rect.area(rect) vẫn hoạt động, nhưng trong phần OOP với Lua trước đây, bạn đã học được cách tốt hơn: dấu hai chấm. rect:area() thực hiện chính xác cùng một lời gọi: Lua tự động truyền bảng đứng trước dấu hai chấm làm đối số đầu tiên, self.
Dấu hai chấm cũng giúp ích khi định nghĩa hàm. function account:deposit(amount) khai báo cho bạn một tham số đầu tiên ẩn có tên là self:
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Maya", balance = 1500}
function account:deposit(amount: number)
self.balance += amount -- self là tham số ngầm định
end
function account:getBalance(): number
return self.balance
endHãy chú ý cách khai báo kiểu ghi rõ self một cách tường minh, deposit: (self: Account, amount: number) -> (), dù dấu hai chấm ẩn tham số này trong phần triển khai. Dấu hai chấm chỉ là cú pháp rút gọn; tham số vẫn tồn tại và kiểu dữ liệu ghi rõ tham số đó. Hàm không trả về giá trị nào có kiểu trả về rỗng -> ().
Cách gọi cũng theo quy tắc bạn đã biết: account:deposit(250) giống hệt account.deposit(account, 250). Hành vi khi chạy cũng giống như trong chương OOP: Luau chỉ bổ sung kiểu dữ liệu.
Hãy chú ý rằng bản thân account không được chú thích kiểu. Kiểu Account mô tả bảng hoàn chỉnh, và bảng chỉ khớp với kiểu đó khi cả hai phương thức đã được gắn vào. Câu lệnh local account: Account = {owner = "Maya", balance = 1500} sẽ khiến chế độ nghiêm ngặt báo lỗi vì thiếu các phương thức.
Thử thách
DễGắn hai phương thức vào một tài khoản bằng cú pháp dấu hai chấm.
- Bên dưới bảng, định nghĩa
function account:deposit(amount: number)để cộngamountvàoself.balance. - Định nghĩa
function account:getBalance(): numberđể trả vềself.balance. - In ra
account:getBalance(), gọiaccount:deposit(120), rồi in raaccount:getBalance()lần nữa.
Nhấn Chạy code: đầu ra hiển thị 300, rồi đến 420.
Tự làm thử
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Noah", balance = 300}
-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) in ra số dư, nạp 120, rồi in ra số dư lần nữa
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