lua元表的相关知识

2023-10-27

setmetatable()和getmetatable():


local a=8
local b = "s"
local t = {1,2}

--在Lua代码中,只能设置table的元表。若要设置其它类型的值得元表,则必须通过C代码来完成
--对于字符串,标准的字符串程序库为所有的字符串都设置了一个元表,而其它类型在默认情况下都没有元表
print(getmetatable(t))  --输出nil
print(getmetatable(b))  --输出table: 0042EA68
print(getmetatable(a))  --输出nil

local t2 = {}
setmetatable(t,t2) --将t2设置为t的元表
print(getmetatable(t))  --输出table: 0026B120

--setmetatable(a,t2)
--print(getmetatable(a)) --报错  /在 Lua 代码中,通过调用setmetatable 来设置且只能设置 table 的元表
setmetatable(b,t2)
print(getmetatable(b))  --报错   /在 Lua 代码中,通过调用setmetatable 来设置且只能设置 table 的元表

元方法__metatable:


Set = {}
local mt = {}

--根据参数列表中的值创建一个新的集合
function Set.New(T)
    local set = {}
    setmetatable(set,mt)
    for _ ,v in pairs(T) do
        set[v]=true
    end
    ----使用__metatable可以保护元表,禁止用户访问元表中的成员或者修改元表
    mt.__metatable = "can not get the metatable"
    return set
end

local tb = Set.New({1,2,3}) --将mt设置为tb的元表
print(tb)

print(getmetatable(tb))  --输出can not get the metatable
local test = {1,2}
setmetatable(test,mt)
print(getmetatable(test))   --输出can not get the metatable
--setmetatable(tb,{}) --报错cannot change a protected metatable  输出"can not get the metatable"


元方法__add:


--------------元方法  __add

local mt ={}

--定义一个元方法
mt.__add = function (t1,t2)
    local temp = {}
    for i, v in pairs(t1) do
        table.insert(temp,v)
    end
    for i, v in pairs(t2) do
        table.insert(temp,v)
    end
    return temp
end

local t1 = {1,2,3}
local t2 = {3,5}
setmetatable(t1,mt) --设置mt为t1的元表
local t3 = t1+t2  --将两个table相加

for i, v in pairs(t3) do
    print(v)  --输出1 2 3 3 5
end

--程序执行顺序:
--lua中两个table原本是无法做相加操作的,但是可以通过__add元方法实现
--先查询t1中是否有对应的元表,若有看看是否定义了__add元方法。如果有则运算
--没有则查询t2中是否有对应的元表,再看看是否定义了__add元方法,有则运算,没有报错

元方法__index:

---
windows = {}
windows.default = {x=0,y=0,color = {r=255,g=255,b=125}}
windows.mt = {} --创建元表

--声明new函数
function windows.new(o)
    setmetatable(o,windows.mt)
    return o
end

--定义__index元方法  对应的是一个有参数的函数
windows.mt.__index = function(table,key)
    return windows.default[key]
end
local www = windows.new({x=10,z=30})
--print(www.x)  --输出10
--print(www.y)  --输出 0
--print(www.color.r)  --输出 255

other1 = {hhh = 666}
other2  ={mmm=333,ppp=999,hhh=5555}
setmetatable(other2,other1)
--定义__index元方法  对应的是一个table
other1.__index =other1
print(other2.hhh)  --输出666
print(other2.jjj)   --输出nil

--定义__index元方法  对应的是一个没有参数的函数
--function setDefault(tb,defaultValue)
--    local mt = {__index = function()return defaultValue end}
--    setmetatable(tb,mt)
--end
--tb1 = {x=10,y=20}
--setDefault(tb1,100)
--print(tb1.x)   --输出 10
--print(tb1.z)   --输出100
--print(tb1.k)   --输出100

--程序执行顺序:
--通过键来访问table时,如果table中没有这个键,那么lua就会查找该table是否有元表
--元表中是否定义了__index元方法,若__index对应的是一个函数,那么lua就会调用这个函数,
--table和键作为参数传给函数;
--若__index对应的是一个table,那么lua就在这个table中查找对应的键

元方法__newindex:

---
local smartMan = {
    name = "king",
    sayhello = function()
        print("你妈喊你回家吃饭")
    end
}
local t1 = {kkk = "7"}
--t1.name = "5"

local mt ={
    --__index = smartMan,
    __newindex = function(table,key,value)
        print("你妈喊你回家拖地")
        rawset(table,key,value)
    end,
}
setmetatable(t1,mt)

t1.kkk = 6
print(t1.kkk) -- 输出 6

t1.kkk = "5"
t1.ggg = "000"  --新增一个索引
print(t1.kkk) --输出   你妈喊你回家拖地    5
--  __newindex元方法用于索引更新

rawget()和rawset():


--rawset(table,index,value)
--在不调用元表的情况下,给table[index]赋值为value
--就是说就算该table有元表,这个函数也会让元方法失去作用
local m1 = {x=1,y=2}
local m2 = {z=3}
setmetatable(m1,m2)
m2.__index = m2

print(m1.z) --输出3

rawset(m1,"z",5)
print(m1.z)  --输出 5

--rawget(table,index)
--不调用元表,获取table真正的值table[index]
local m3 = {x=1,y=2}
local m4 = {x=6,z=8}
setmetatable(m3,m4)
m4.__index = m4
print(m3.x) --输出 1
print(m3.z) --输出 8

local zhi= rawget(m3,"z")
print(zhi) --输出nil

元方法总汇:
在这里插入图片描述
后续若有在项目中碰到其他元方法再补上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lua元表的相关知识 的相关文章

  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 什么时候适合使用Lua这样的嵌入式脚本语言

    我玩 魔兽世界 大约有两年了 我对用来编写插件的 Lua 很好奇 由于到目前为止我读到的有关 Lua 的内容都是 快 轻 和 这太棒了 所以我想知道如何以及何时使用它 您需要在系统中嵌入像 Lua 这样的脚本语言的典型情况是什么 当您需要最
  • 尝试将 nil 与数字堆栈回溯进行比较?

    我正在通过以下链接玩 Lua https www lua org pil 4 2 html https www lua org pil 4 2 html并对某一点感到困惑 Lua 5 2 4 Copyright C 1994 2015 Lu
  • Lua中如何获取表中的最大整数?

    Lua中如何获取表中的最大整数 在Lua 5 1及更早版本中 你可以使用 math max unpack 1 2 3 4 5 这受到Lua堆栈大小的限制 在 PUC Lua 5 1 上 该值的最大值可达 ca 8000 个数字 如果堆栈空闲
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • 去掉尾随零和小数点

    使用 Lua 我将数字格式化为可变位数并去掉尾随零 小数点 例如 string format precision f value gsub 0 1 gsub 值的类型为数字 正数 负数 整数 小数 所以任务已经解决了 但出于美学 教育和性能
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 如何在 emacs lua-mode 中配置缩进?

    完整的 emacs 新手在这里 我在 Ubuntu 上使用 emacs 23 1 1emacs 入门套件 https github com technomancy emacs starter kit 我主要在 lua 模式下工作 安装了pa
  • 如何在我的 Lua 脚本中添加“睡眠”或“等待”?

    我正在尝试通过更改一天中的时间来为游戏制作一个简单的脚本 但我想快速完成 这就是我要说的 function disco hour minute setTime 1 0 SLEEP setTime 2 0 SLEEP setTime 3 0
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下
  • 在 Lua 中只归档一次

    我想知道是否有一种方法可以只执行一次 lua 文件 并且后续尝试执行该 lua 文件将导致无操作 我已经考虑过做一些类似于 C header 的 if else endif 技巧的事情 我想知道是否有一个标准方法来实现这一点 James w
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 克隆一个lua状态

    最近 我在使用C 和Lua进行开发时遇到了很多困难 我的情况是 由于某种原因 我的 C 程序中可能有数千个 Lua 状态 但这些状态在初始化后应该是相同的 当然 我可以为每个状态执行 luaL loadlibs 和 lua loadfile
  • 适用于 IEEE 802.15.4 的 Wireshark Lua 解析器 - DissectorTable 名称?

    我正在lua中开发wireshark解析器来解析基于802 15 4的自定义协议 不幸的是我无法找出正确的 DissectorTable 名称 table DissectorTable get wpan wpan does not work
  • 在 Lua/LuaFileSystem 中创建一个新文件

    我已经查看了 Lua 和 LuaFileSystem 文档 但尚未找到创建新文件的方法 我也在这里四处寻找 但目的相同 请注意 我正在寻找的解决方案必须与操作系统无关 以确保可移植性 但我很高兴针对不同的系统获得不同的答案 示例 将 Hel
  • 如何使用 Torch7 进行预测

    我仍在熟悉 Torch 到目前为止一切顺利 然而 我遇到了一个死胡同 我不知道如何解决 如何让 Torch7 或更具体地说 dp 库 来评估单个输入并返回预测输出 这是我的设置 基本上是 dp 演示 require dp hyperpara
  • 如何循环遍历表并保持顺序?

    我得到了下表 local a 12 30 24 60 60 year 30 24 60 60 month 24 60 60 day 60 60 hour 60 minute 1 second 但是 当我对它进行配对循环并打印 key val
  • 如何重载Lua字符串下标运算符?

    This debug getmetatable index function s i return s sub i i end 和这个 debug getmetatable index proc lua read 不起作用 Try debu
  • Lua userdata数组访问及方法

    我正在用 C 编写一个用户数据类型 以便在 Lua 中使用 它有一些数组类型的属性和各种方法 现在如果你是这种类型 我使用u set k v resp u get k 访问数据 例如u sort 作为方法 为此我设置了 index到包含这些
  • 从Lua到C的Lua嵌套表

    我不幸未能将嵌套 Lua 表转换为 C json 对象 我正在使用 LuaTableToJson 请参阅后面的代码 其中 index 是要检索的参数索引 PopOneArg 是根据值的类型处理值的例程 当有嵌套表时 我想递归地调用 LuaT

随机推荐

  • FlatBuffers在Java中的使用

    1 去maven仓库下载官网库flatbuffers java 1 7 0 1 jar 地址 点击打开链接 2 编写fbs文件 chat fbs namespace Proto 聊天频道 enum ChatChannel byte SYST
  • 利用Logstash plugins做更多的事情

    1 引言 之前一篇文章 Logstash 介绍及linux下部署 我们实现了logstash的安装以及简单的控制台标准输入输出测试 那么logstash能不能做更多的事情呢 答案是肯定的 logstash就是为了处理日志数据而生的 一个最直
  • mysql下出现Unknown column 'xx' in 'on clause'的完全解决方法

    mysql下出现Unknown column xx in on clause 的完全解决方法 在项目中执行查询无结果 在数据库运行sql报错 Unknown column xx in on clause 百度过后找到这个文章并完全解决了问题
  • 欠拟合和过拟合

    过拟合 定义 具体表现就是最终模型在训练集上效果好 在测试集上效果差 模型泛化能力弱 具体表现就是最终模型在训练集上效果好 在测试集上效果差 模型过于复杂 过拟合的原因 训练数据中噪音干扰过大 使得学习器认为部分噪音是特征从而扰乱学习规则
  • Nginx二级项目配置

    Nginx二级项目服务页面部署 应用场景 比如一个项目需要一个正常的生产服务的地址在根目录 现在需要一个后台管理项目可以部署在 admin 的路径下 需要帮助文档的页面可以部署在 help nginx conf 配置 location ma
  • 【SQL注入-08】二次注入案例—以sqli-labs-less24为例

    目录 1 二次注入概述 1 1 定义 1 2 思路 2 二次注入案例 2 1 实验平台 2 2 实验目标 2 3 具体注入过程 2 3 1 注入前准备 2 3 2 确定目标账户admin 2 3 3 第一次注入 2 3 4 第二次注入 2
  • eos bp节点 超级节点搭建

    https github com nebulaprotocol 这个网址里面有一个 fake terminal website 比较有意思 可以看看示例 https bp nebulaprotocol com 搭建eos BP节点 环境搭建
  • 家政服务小程序制作攻略揭秘

    想要打造一个家政服务小程序 但是又不懂编程和设计 不用担心 下面将为你详细介绍如何利用第三方平台 从零开始打造一个家政服务小程序 首先 你需要找到一个适合的第三方平台 例如乔拓云网 在乔拓云网的 轻应用小程序 中 点击 去管理 你就可以进入
  • 回顾2021,展望2022

    2021 这一年最大的收获是孕育了一个聪明漂亮机灵的小家伙 这一年我虚岁28岁 和爱的人有了爱的结晶 东哥各方面都挺好的 我们都不是圣人 都是能力有限的普通人 但他在尽其所能的对我好 我不是万能的人 但也独立坚强 之后一个人带娃的日子适应的
  • LaTeX公式中指定某些字母或符号为正体

    m rm G 显示效果为
  • I/O 函数/缓存和字节流、占位符、getchar(),putchar()

    I O 函数 C 语言提供了一些函数 用于与外部设备通信 称为输入输出函数 简称 I O 函数 输入 import 指的是获取外部数据 输出 export 指的是向外部传递数据 缓存和字节流 严格地说 输入输出函数并不是直接与外部设备通信
  • 从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明

    一 异常与继承 如果异常类型为C 的类 并且该类有其基类 则应该将派生类的错误处理程序放在前面 基类的错误处理程序放在后面 include
  • python3.5源码分析-启动与虚拟机

    Python3源码分析 本文环境python3 5 2 参考书籍 lt
  • 虚幻引擎游戏开发过程中,游戏鼠标如何双击判定?

    UE虚幻引擎对于游戏开发者来说都不陌生 市面上有47 主机游戏使用虚幻引擎开发游戏 作为是一款游戏的核心动力 它的功能十分完善 囊括了场景制作 灯光渲染 动作镜头 粒子特效 材质蓝图等 本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判定 一起
  • 数据库变更管理:Liquibase or Flyway

    从零打造项目 系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实
  • vsftpd默认值

    原文地址 http vsftpd beasts org vsftpd conf html 国内解释 http hi baidu com 346430756 blog item 5527e9363402652a0b55a9d0 html VS
  • Leetcode链表篇总结(C++)

    文章目录 一 基础知识 二 经典题目 1 203 移除链表元素 简单 2 707 设计链表 中等 3 206 反转链表 简单 4 142 环形链表 中等 5 19 删除链表的倒数第N个结点 中等 6 面试题 02 07 链表相交 简单 三
  • Java实现添加文字水印、图片水印功能实战

    本文介绍java实现在图片上加文字水印的方法 水印可以是图片或者文字 操作方便 java实现给图片添加水印实现步骤 获取原图片对象信息 本地图片或网络图片 添加水印 设置水印颜色 字体 坐标等 处理输出目标图片 一 java实现给图片添加文
  • 目标检测的数据格式

    在目标检测任务中 常见的数据集格式有三种 分别为voc coco yolo 一 VOC voc数据集由五个部分构成 JPEGImages Annotations ImageSets SegmentationClass以及Segmentati
  • lua元表的相关知识

    setmetatable 和getmetatable local a 8 local b s local t 1 2 在Lua代码中 只能设置table的元表 若要设置其它类型的值得元表 则必须通过C代码来完成 对于字符串 标准的字符串程序