setmetatable và getmetatable
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 17 trên 54.
Giờ đây, khi đã hiểu khái niệm metatable, bạn hãy học cách làm việc với chúng. Lua cung cấp hai hàm thiết yếu cho việc này: setmetatable() để gắn một metatable vào bảng và getmetatable() để lấy metatable đó.
Để gắn một metatable vào một bảng, bạn dùng setmetatable(). Hàm này nhận hai đối số: bảng bạn muốn chỉnh sửa (bảng chính) và metatable bạn muốn gắn vào bảng đó:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)Trong ví dụ này, myMetatable hiện được gắn vào myTable. Bản thân metatable hiện vẫn trống, nhưng điều này thiết lập mối liên kết giữa hai bảng. Hàm setmetatable() cũng trả về bảng chính, cho phép bạn nối tiếp thao tác nếu cần.
Để lấy metatable được gắn với một bảng, bạn dùng getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Đầu ra: trueHàm này trả về siêu bảng nếu bảng có gắn siêu bảng, hoặc nil nếu bảng không có siêu bảng. Điều này hữu ích khi bạn cần kiểm tra hoặc chỉnh sửa siêu bảng của bảng sau khi đã thiết lập.
Hiểu hai hàm này là nền tảng cho mọi thao tác với siêu bảng trong Lua. Khi đã biết cách gắn và lấy siêu bảng, bạn sẽ sẵn sàng định nghĩa các phương thức siêu dữ liệu để thay đổi cách các bảng hoạt động.
Thử thách
DễViết một hàm (function) attachMetatable nhận mainTable và metaTable, rồi trả về true nếu gắn metatable thành công.
Dùng setmetatable() để gắn metatable vào bảng chính, sau đó xác minh việc gắn bằng getmetatable().
Logic:
- Gắn
metaTablevàomainTablebằngsetmetatable() - Lấy metatable đã gắn bằng
getmetatable() - So sánh metatable vừa lấy với
metaTableban đầu - Trả về
truenếu chúng khớp, nếu không thì trả vềfalse
Tham số:
mainTable(bảng): Bảng sẽ được gắn metatablemetaTable(bảng): Metatable cần gắn
Giá trị trả về: true nếu metatable được gắn và xác minh thành công, nếu không thì trả về false (kiểu boolean)
Tự làm thử
function attachMetatable(mainTable, metaTable)
-- Viết code vào đâ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