Menu
CoddyTech

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: true

Hà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.

challenge icon

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 metaTable vào mainTable bằng setmetatable()
  • Lấy metatable đã gắn bằng getmetatable()
  • So sánh metatable vừa lấy với metaTable ban đầu
  • Trả về true nếu chúng khớp, nếu không thì trả về false

Tham số:

  • mainTable (bảng): Bảng sẽ được gắn metatable
  • metaTable (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
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