setmetatable
函数可以为一个表设置元表。如果元表中存在 __metatable
键,则 setmetatable
会失败。
lualocal mytable = {} local mymetatable = {} setmetatable(mytable, mymetatable)
或者更简洁的写法:
luamytable = setmetatable({}, {})getmetatable
函数可以获取一个表的元表。
lualocal meta = getmetatable(mytable)__index
元方法是元表中最常用的键。当访问表中不存在的键时,Lua 会查找该表的元表中的 __index
键。如果 __index
包含一个表,Lua 会在该表中查找相应的键。
luamymetatable.__index = { a = 1, b = 2 }
这样,当访问 mytable.a
或 mytable.b
时,Lua 会在 __index
表中查找这些键。以下是一个使用元表的小项目示例,该项目实现了一个简单的“模块”系统,通过元表的 __index
元方法来访问模块中的函数。
lua-- 文件名:module.lua
-- 定义一个模块表
local module = {}
-- 定义模块的私有数据
local privateData = {
secret = "This is a secret"
}
-- 定义模块的公有函数
function module.publicFunction()
print("Public function called")
end
-- 定义模块的元表
local moduleMetatable = {
__index = function(table, key)
-- 如果访问的键不存在,则尝试从私有数据中获取
if privateData[key] then
return privateData[key]
end
-- 如果键是模块的公有函数,则返回该函数
if module[key] then
return module[key]
end
end
}
-- 设置模块的元表
setmetatable(module, moduleMetatable)
-- 返回模块
return module
使用模块的代码:
lua-- 文件名:main.lua
local myModule = require("module")
-- 访问模块的公有函数
myModule.publicFunction()
-- 访问模块的私有数据
print(myModule.secret) -
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。