Menu
CoddyTech

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
end

Lư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 PhD

Giố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.

challenge icon

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ường text để 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:

  1. Văn bản chức danh (ví dụ: "Engineer")
  2. Một chuỗi tiền tố đặt trước chức danh (ví dụ: "Senior ")
  3. 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:

  1. Nối chuỗi tiền tố với đối tượng chức danh
  2. 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 III

Dò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ả
quiz iconTự kiểm tra

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

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