Lua | 每日一练 (2)

news/2025/2/21 6:03:59/

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

文章目录

  • 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

🌺🌺🌺撒花!

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

在这里插入图片描述


http://www.ppmy.cn/news/1573339.html

相关文章

在 Kubernetes (K8s) 环境中,备份 PostgreSQL 数据库

在 Kubernetes (K8s) 环境中&#xff0c;备份 PostgreSQL 数据库有一些特殊的考虑&#xff0c;因为数据库通常运行在容器中&#xff0c;并且数据存储在卷&#xff08;如 PersistentVolume&#xff09;中。你可以通过几种方式在外部备份 PostgreSQL 数据库&#xff0c;下面是一些…

【EndNote】WPS 导入EndNote 21

写在前面&#xff1a;有没有人有激活码&#xff0c;跪求&#xff01; EndNote&#xff0c;在文献管理和文献引用方面很好用。写文章的时候&#xff0c;使用EndNote引入需要的文献会很方便。我目前用的WPS&#xff0c;想把EndNote的CWYW&#xff08;Cite While You Write&#…

Flutter 3.29.0 新特性 CupertinoNavigationBar 可配置bottom属性

Flutter 3.29版本优化了开发流程并提升了性能&#xff0c;对 Impeller、Cupertino、DevTools 等进行了更新。 CupertinoNavigationBar和CupertinoSliverNavigationBar现在接受底部小部件&#xff0c;通常是搜索字段或分段控件。 例如本小节内容就是放置了一个输入框&#xff…

PostgreSQL 添加索引导致崩溃,参数调整需谨慎--文档未必完全覆盖场景

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共2720人左右 1 …

初识Linux(9):程序地址空间

实验&#xff1a; 1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 #include <string.h>5 6 int g_val 100;7 8 int main()9 {10 printf("我是一个进程: pid:%d,ppid:%d\n",getpid(),getppid());11 pid_t id for…

postgresql FSM页面怎么组织

PostgreSQL 的空闲空间映射&#xff08;Free Space Map&#xff0c;FSM&#xff09;是用于跟踪堆和索引关系中可用空间的数据结构。FSM 的设计目标是快速定位到有足够空间容纳新元组的页面&#xff0c;或者决定是否需要扩展新的页面。 FSM 页面的组织方式 存储结构 每个堆和索…

什么是AI Agent、Chat、RAG、MoE

什么是AI Agent、Chat、RAG、MoE 目录 什么是AI Agent、Chat、RAG、MoE定义与原理功能特点应用场景AI Agent有哪些关键组成部分感知模块决策模块知识模块行动模块学习模块AI Agent、Chat、RAG、MoE是人工智能领域中不同的概念和技术,它们在功能、原理和应用等方面存在一些区别…

matlab齿轮传动

实现齿轮啮合分析&#xff0c;齿轮传动非线性分析&#xff0c;对扭转振动方程组进行求解&#xff0c;可得到齿轮扭转角随时间变化相关参数 列表 齿轮传动非线性分析&#xff0c;对扭转振动方程组进行求解&#xff0c;可得到齿轮扭转角随时间变化相关参数/niu_gou_yuan_Rg.m , …