Menu
CoddyTech

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
end

Hã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.

challenge icon

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.

  1. Bên dưới bảng, định nghĩa function account:deposit(amount: number) để cộng amount vào self.balance.
  2. Định nghĩa function account:getBalance(): number để trả về self.balance.
  3. In ra account:getBalance(), gọi account:deposit(120), rồi in ra account: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

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