lua 元表Metatable (六)
2024-09-05 04:56:12
元表理解起来比较抽象,但这是lua设置的一种数据结构而已, 假设有table_A、table_B 这2个table,如果table_A要操作table_B,显然是不可能的
因为者都之间是没有关系的,如果把table_B设置成了table_A 的元表,那么table_A就可以操作table_B里面的元素,甚至可以对2个table里面的元
素进行运算操作元表的
设置语法:setmetatable(table_A,table_B)
元表里面有以下元方法:
.__index --- 该方法主要是用来对表访问。
通过它来设置metatable的键,table通过这个键来获取metatable中的值
.__newIndex --- 该方法主要是对表更新。
当给一个表中的索引赋值时,解释器就会调用查找__newIndex方法,如果存在则调用进行赋值操作
mytable = {}; -- 普通表
mymetatable = {__metatable="hi"}; -- 元表
setmetatable(mytable,mymetatable); -- 把mymetatable 设置成mytable的元表
mytable = setmetatable({},{}); -- 也可以写成这样
getmetatable(mytable); -- 返回mymetatable -- __index 作为键时 local table_A = { k1 = "Hello"}
local table_B = {k2 = "world"}
setmetatable(table_A,{ __index = table_B })
print(table_A.k1)
print(table_A.k2) -- __index 是函数时 function fun1(table,key)
print(table,"\n",key)
return "hello"
end
local table_A = { k1 = "world"} setmetatable(table_A,{ __index = fun1 }) -- 会将table_A 和k1作为参数传递给fun1
print(table_A.k2) --- Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
--- 1.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;
--- 如果 __index 方法是一个表则返回一个表,按2.3步骤查找
--- 2.在表中查找,如果找到,返回该元素,找不到则继续
--- 3.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
--- 2.__newindex作为键时
local table_A = { k1 = "hi"}
local table_B = {}
table_A = setmetatable(table_A,{__newindex = table_B})
table_A.k1 = "hihi"
table_A.k2 = "haha"
print("修改后的是:",table_A.k1,table_A.k2,table_B.k2)
-- __newindex为函数是
function fun4(table,key,value)
print(table,"\n",key,value)
end
local table_A = {k1 = "hi"}
setmetatable(table_A,{__newindex = fun4 })
table_A.k2 = "Good"
最新文章
- Promise对象
- 远程调试js注意事项
- 深入理解php底层:php生命周期 [转]
- 入坑HttpServletRequest.getParameterMap
- Unity发送短信
- Sublime 插件安装
- C++ 可以多个函数声明
- Java--调试--单步调试,断言,单元测试
- PHP cookie禁用时session 方案
- 利用git pull的勾子实现敏捷部署
- tomcat会话之持久化会话管理器
- 同样的so,放到不同的project中,就会报错
- python+opencv 运行环境搭建
- AutoMatic merge failed;fix conflicts and then commit the result.解决方法
- RxJava响应式编程,入门的HelloWorld;
- Noip前的大抱佛脚----考场配置
- centos7 卸载 gitlab
- 输入LPCWSTR类型字符串
- Nginx 作为反向代理优化要点proxy_buffering
- JAVA实现DIJKSTRA算法