当前位置: 首页 > article >正文

Lua | 每日一练 (2)

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • Lua | 每日一练 (2)
    • 题目
    • 参考答案

Lua | 每日一练 (2)

题目

简述 lua 中的元表(metatable),它的作用是什么?有哪些使用场景?

参考答案

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 元方法,可以实现只读属性或者动态字段

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
  • 模拟面向对象编程
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.
  • 数据验证
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

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述


http://www.kler.cn/a/550811.html

相关文章:

  • 分布式 IO 模块:食品罐装产线自动化与高效运行的推手
  • LogicFlow 在 React/Vue 中的完整安装使用指南
  • 【数据结构基础_链表】
  • 3D与2D机器视觉机械臂引导的区别
  • 【Spring】Spring MVC案例
  • 【强化学习的数学原理】第08课-值函数近似-笔记
  • docker 安装 nacos 与配置持久化详解
  • 【Python】实现文件移动与文件夹删除工具
  • QT (四)模型/视图 QFileSystemModel,QStringListModel,QStandardItemModel
  • 算法刷题--哈希表--快乐数
  • 算法日常刷题笔记(1)
  • Arkts和Typescript语法上差别
  • Sojson高级加密技术科普
  • Unreal5从入门到精通之使用 BindWidget 将 C++ 连接到 UMG 蓝图
  • 公网远程家里局域网电脑过程详细记录,包含设置路由器。
  • 用deepseek学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理
  • pdf文档提取信息
  • 新一代网红孵化管理工具核心功能拆解:AI+大数据应用
  • Visual Basic语言的数据类型
  • Vgg 改进:添加EMA注意力机制高效提升跨空间学习