“self” tường minh
Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 2 trên 70.
Khi một hàm (function) nằm bên trong một bảng, nó thường cần truy cập hoặc sửa đổi dữ liệu trong chính bảng đó. Nhưng vấn đề là: làm sao hàm biết nó thuộc về bảng nào?
Cách giải quyết là truyền rõ ràng bảng làm đối số đầu tiên cho hàm. Theo quy ước, tham số này được đặt tên là self:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
print(counter.value) -- Đầu ra: 1Hãy chú ý cách ta gọi counter.increment(counter), truyền chính bảng đó làm đối số. Bên trong hàm, self giờ đây tham chiếu đến bảng đó, cho phép ta đọc và sửa đổi self.value.
Mẫu này rất cần thiết vì giúp hàm thao tác với dữ liệu của bảng mà không cần ghi cứng tên bảng. Hãy xem một hàm đặt lại và trả về số đếm hiện tại:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Đầu ra: 1
print(counter.value) -- Đầu ra: 0Dù truyền bảng theo cách thủ công vẫn hiệu quả, nhưng việc này có thể khiến bạn cảm thấy lặp đi lặp lại. Trong bài học tiếp theo, bạn sẽ học một cú pháp gọn gàng hơn để tự động xử lý việc này.
Thử thách
DễTạo một bảng tên là tracker với trường count được khởi tạo bằng 0.
Thêm một hàm (function) tracker.addAmount(self, amount) thực hiện các việc sau:
- Nhận
self(bảng) làm tham số đầu tiên - Nhận
amountlàm tham số thứ hai - Cộng
amountvàoself.count
Bạn sẽ nhận được hai đầu vào:
- Lượng thứ nhất cần cộng
- Lượng thứ hai cần cộng
Gọi tracker.addAmount hai lần, mỗi đầu vào một lần, và truyền bảng làm đối số đầu tiên mỗi lần. Sau cả hai lần gọi, in ra giá trị cuối cùng của tracker.count.
Tự làm thử
-- Đọc đầu vào
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())
-- TODO: Viết code bên dưới
-- Tạo bảng tên là 'tracker' với trường 'count' có giá trị ban đầu là 0
-- Thêm hàm (function) tracker.addAmount(self, amount) để cộng amount vào self.count
-- Gọi tracker.addAmount hai lần, truyền bảng làm đối số đầu tiên
-- In ra giá trị count cuối cùng
print(tracker.count)Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch Lua online