Menu
CoddyTech

Metamethod __tostring

Thuộc phần Logic và luồng chương trình trong hành trình Lua của Coddy. Bài học 20 trên 54.

Khi in ra một bảng trong Lua, bạn thường thấy nội dung không hữu ích như table: 0x5f8a20, chỉ là một địa chỉ bộ nhớ. Phương thức siêu dữ liệu __tostring cho phép bạn thay đổi hành vi này bằng cách xác định chính xác nội dung cần hiển thị khi bảng được chuyển thành chuỗi.

Phương thức siêu này đặc biệt hữu ích khi gỡ lỗi và tạo đầu ra gọn gàng hơn. Khi Lua cần chuyển bảng của bạn thành chuỗi, chẳng hạn như khi dùng print(), Lua sẽ kiểm tra xem bảng có metatable chứa trường __tostring hay không. Nếu có, Lua sẽ gọi hàm đó và dùng giá trị trả về của hàm thay cho cách biểu diễn mặc định.

Đây là cách triển khai:

local vector = {x = 3, y = 4}
local meta = {
    __tostring = function(t)
        return "Vector(" .. t.x .. ", " .. t.y .. ")"
    end
}

setmetatable(vector, meta)

print(vector)  -- Đầu ra: Vector(3, 4)

Hàm __tostring nhận bảng làm đối số và phải trả về một chuỗi. Trong ví dụ này, hàm tạo một chuỗi được định dạng để hiển thị giá trị x và y của véc-tơ theo cách dễ đọc.

Điều này giúp bạn làm việc với code dễ dàng hơn nhiều. Thay vì thấy các địa chỉ bộ nhớ khó hiểu khi gỡ lỗi, bạn sẽ nhận được thông tin hữu ích về những gì bảng của bạn chứa.

challenge icon

Thử thách

Dễ

Viết hàm createPoint nhận tọa độ x và y, rồi trả về một bảng điểm có biểu diễn chuỗi tùy chỉnh.

Tạo một bảng có các trường x và y, gắn metatable có metamethod __tostring, rồi trả về kết quả chuyển bảng thành chuỗi bằng tostring().

Lô-gic:

  • Tạo một bảng có các khóa x và y được gán tọa độ đã cho
  • Tạo một metatable có __tostring trả về chuỗi theo định dạng "Point(x, y)"
  • Gắn metatable vào bảng điểm bằng setmetatable()
  • Trả về tostring(point) để nhận biểu diễn chuỗi tùy chỉnh

Tham số:

  • x (số): Tọa độ x của điểm
  • y (số): Tọa độ y của điểm

Giá trị trả về: Biểu diễn chuỗi tùy chỉnh của điểm theo định dạng "Point(x, y)" (chuỗi)

Tự làm thử

function createPoint(x, y)
    -- Viết code ở đây
end
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 Logic và luồng chương trình

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