Nối các đối tượng
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 28 trên 70.
Toán tử .. trong Lua nối các chuỗi, nhưng nếu bạn muốn kết hợp một đối tượng với một chuỗi thì sao? Phương thức siêu dữ liệu __concat cho phép bạn xác định chính xác cách hoạt động này.
Khi Lua gặp a .. b và một toán hạng có phương thức chuyển đổi __concat, Lua sẽ gọi hàm đó với cả hai giá trị. Cách này hữu ích khi bạn muốn các đối tượng kết hợp tự nhiên trong biểu thức chuỗi.
local Name = {}
Name.__index = Name
function Name:new(first, last)
local obj = {first = first, last = last}
setmetatable(obj, Name)
return obj
end
function Name.__concat(a, b)
if type(a) == "string" then
return a .. b.first .. " " .. b.last
else
return a.first .. " " .. a.last .. b
end
endLưu ý rằng hàm kiểm tra toán hạng nào là chuỗi. Vì .. có thể dùng theo cách "Hello " .. obj hoặc obj .. "!", phương thức giả lập của bạn nên xử lý cả hai trường hợp.
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- Đầu ra: Dr. Ada Lovelace
print(person .. " PhD") -- Đầu ra: Ada Lovelace PhDGiống các siêu phương thức toán tử khác, __concat được viết với dấu chấm theo quy ước và nhận cả hai toán hạng làm đối số. Điểm khác biệt chính so với các siêu phương thức số học là bạn thường làm việc với các kiểu dữ liệu khác nhau: đối tượng của bạn và một chuỗi.
Thử thách
DễHãy tạo một lớp Title có thể kết hợp tự nhiên trong các biểu thức chuỗi bằng toán tử ... Cách này hữu ích khi bạn muốn kết hợp đối tượng với chuỗi theo cách dễ đọc, trực quan, chẳng hạn như thêm kính ngữ hoặc hậu tố vào chức danh của một người.
Bạn sẽ sắp xếp code trong hai tệp:
Title.lua: Định nghĩa lớp Title với trườngtextđể lưu chuỗi chức danh. Thêm hàm khởi tạo:new(text)và triển khai phương thức metamethod__concat. Phương thức metamethod cần xử lý cả hai trường hợp: khi chuỗi đứng trước đối tượng ("prefix" .. obj) và khi chuỗi đứng sau (obj .. "suffix"). Kết quả cần kết hợp chuỗi với phần văn bản của chức danh cho phù hợp.main.lua: Yêu cầu module Title, tạo một instance chức danh và minh họa phép nối từ cả hai phía.
Bạn sẽ nhận ba đầu vào:
- Văn bản chức danh (ví dụ: "Engineer")
- Một chuỗi tiền tố đặt trước chức danh (ví dụ: "Senior ")
- Một chuỗi hậu tố đặt sau chức danh (ví dụ: " III")
Trong tệp chính, hãy tạo một Title với văn bản đã cho. Sau đó thực hiện hai phép nối và in mỗi kết quả trên một dòng riêng:
- Nối chuỗi tiền tố với đối tượng chức danh
- Nối đối tượng chức danh với chuỗi hậu tố
Ví dụ: nếu đầu vào là Engineer, Senior và III, đầu ra sẽ là:
Senior Engineer
Engineer IIIDòng đầu tiên cho thấy tiền tố được kết hợp với chức danh, còn dòng thứ hai cho thấy chức danh được kết hợp với hậu tố. Phương thức metamethod __concat giúp bạn kết hợp chuỗi một cách tự nhiên!
Tự làm thử
-- Đọc các đầu vào
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Nạp module Title bằng require
local Title = require('Title')
-- TODO: Tạo một instance Title với titleText đã cho
-- TODO: Nối prefix với đối tượng title rồi in kết quả
-- TODO: Nối đối tượng title với suffix rồi in kết quả
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