💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥
文章目录
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 = self
obj.name = name or ""
return obj
end
function 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" then
error("only numbers are allowed")
end
if v < 0 then
error("negative values are not allowed")
end
end
}
setmetatable(proxy, mt) -- 代理表设置元表
return proxy
end
local validated_table = validate({ a = 1, b = 2 })
validated_table.a = -1 -- negative values are not allowed
validated_table.b = "string" -- only numbers are allowed
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。
