💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥
文章目录
- Lua | 每日一练 (2)
- 题目
- 参考答案
Lua | 每日一练 (2)
题目
简述 lua
中的元表(metatable
),它的作用是什么?有哪些使用场景?
参考答案
在 lua
中元表主要作用改变表的默认行为(函数)。通过使用元表,可以为表定义特殊的元方法,从而使用运算符重载、访问控制、面向对象等功能。
- 自定义运算符
lua">local v1 = { x = 3, y = 4 } -- 定义表 v1,其中包含元素 x 和 y
local v2 = { x = 1, y = 2 }-- 定义自定义运算函数
local add = function(a, b)return { x = a.x + b.x, y = a.y + b.y }
end-- 设置 v1 表的元表,并设置 add 元方法
setmetatable(v1, { __add = add })-- 设置 v2 表的元表,并设置 add 元方法
setmetatable(v2, { __add = add })local ret = v1 + v2
print(ret.x, ret.y) -- 4 6
- 控制属性访问
通过 __newindex
或 __index
元方法,可以实现只读属性或者动态字段
lua">local readonly = { x = 10 }
local proxy = {} -- 添加代理表local mt = {-- 读取操作:从原始表中获取值__index = function(tb, key)return readonly[key]end,-- 写入操作:拦截所有赋值操作并抛出错误__newindex = function(tb, key, value)error("attempt to modify a read-only table")end
}setmetatable(proxy, mt) -- 对代理表设置元表print(proxy.x) -- 10
proxy.x = 20 -- attempt to modify a read-only table
proxy.y = 1 -- attempt to modify a read-only table
- 模拟面向对象编程
lua">local Animal = {}function Animal:new(name)local obj = {}setmetatable(obj, self)self.__index = selfobj.name = name or ""return obj
endfunction Animal:speak()print(self.name .. " makes a sound.")
end-- 创建对象
local dog = Animal:new("dog")
dog:speak() -- dog makes a sound.
- 数据验证
lua">local function validate(tbl)local proxy = {} -- 添加代理表local mt = { __index = tbl,__newindex = function(t, k, v)if type(v) ~= "number" thenerror("only numbers are allowed")endif v < 0 thenerror("negative values are not allowed")endend}setmetatable(proxy, mt) -- 代理表设置元表return proxy
endlocal validated_table = validate({ a = 1, b = 2 })
validated_table.a = -1 -- negative values are not allowed
validated_table.b = "string" -- only numbers are allowed
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。