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.
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
xvàyđược gán tọa độ đã cho - Tạo một metatable có
__tostringtrả 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ểmy(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
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
4Giới thiệu về metatable
Metatable là gì?setmetatable và getmetatableMetamethod __indexMetamethod __newindexMetamethod __tostringMetamethod số học phần 1Metamethod số học phần 2Ôn tập: bảng chỉ đọc2Các hàm khác của thư viện table
table.concat()Tạo table và unpack()table.sort()Sắp xếp tùy chỉnh bằng hàmÔn tập: Bảng điểm cao5Dự án: Bộ máy trò chơi phiêu lưu bằng văn bản
Thiết lập dự án: Căn phòngLiên kết các phòngTự luyện tập: Trình biên dịch Lua online