如何理解 Lua 中的 metatable?
2016-6-6 16:40:19
收藏:0
阅读:106
评论:2
我之前使用过 Python,但现在我因为 Torch 正在学习 Lua。对我来说,“metatable”这个词真的很难理解。例如,metatable 是一种特殊类型的表吗?它是如何改变表的行为的?
点赞
用户11740758
你好
在阅读和理解元表可以是什么之后,我想发表一个可行的示例。这样每个人都可以看到和感受到它有多有用。示例更改了关联表的#运算符。因为我意识到#仅计算没有命名的键。#也会忽略0和负数。下面是一个有效的示例,可以用一个正确计数的函数替换它...
#lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org,PUC-Rio
> - 定义一个带有3个键/值对的表
> my_table={[0]=0,[1]=1,['metatable']={}}
> #my_table
1
> - #计算错误,它只计算my_table [1]
> - 现在设置my_table.metatable为空my_table
> setmetatable(my_table,my_table.metatable)
> - 所以它可以在没有getmetatable()的情况下访问
> - 现在在my_table.metatable中将#替换为关联的表my_table
> 使用元函数__len,my_table.metatable.__len = function(array)local incr = 0 for _ in pairs(array)do incr = incr + 1 end return incr end
> - 让我们测试#...
> #my_table
3
> - 现在#是有用的,因为它计算正确
> - my_table.metatable可以设置为其他表的元表
> - 在这些表中,#计算错误,但需要正确计数的方式
> #_G
0
> setmetatable(_G,my_table.metatable)
> #_G
45
> #package.loaded
0
> setmetatable(package.loaded,my_table.metatable)
> #package.loaded
12
> - 就像_G或package.loaded一样
2020-07-15 08:33:34
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
元表
元表是一个用于控制另一张表(或用户数据、其他 Lua 值)行为的表。一个表之所以成为元表,是因为它被用作元表。也就是说,"元表" 不是表的本质属性。没有 "create_metatable" 函数或其他什么函数。我们使用 "元表" 这个名词只是为了方便称呼一个用于控制其他表的表。
对表(或用户数据)进行某些操作时,会首先检查表的元表。如果表(或用户数据)具有元表,并且元表中有特定的键/值对,则该操作将使用该键/值对代替正常逻辑来执行该操作。
每个可以被元表覆盖的操作都有一个关联的特定键名。因此,如果您尝试对表执行加法操作,系统将查找元表中的
__add键以访问它。键值对中的值通常(尽管不总是)是一个函数。此类函数通常称为 "元函数"。它所采用的参数以及其返回值的含义由调用它的特定操作定义。一些操作允许该值为表或其他内容。
在 Lua 中,您可以使用
setmetatable函数为表(但不是用户数据)分配元表。从 C 中,您可以使用lua_setmetatable函数为表(或用户数据)分配元表。在将 C 对象公开为用户数据的 C 代码中,元表特别重要。原始用户数据只是一堆不透明的比特。默认情况下,Lua 只定义了极少数的可以对其执行的合法操作。但是,通过为它们分配元表,您可以通过元函数为用户数据提供更多的能力。
请注意,除表和用户数据之外的 Lua 值也可以具有元表。但是,与表和用户数据不同,每种 Lua 类型的值都共享该类型的 相同 元表。因此,所有字符串具有相同的元表,所有数字具有相同的元表等。