元表理解起来比较抽象,但这是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"

 

最新文章

  1. Promise对象
  2. 远程调试js注意事项
  3. 深入理解php底层:php生命周期 [转]
  4. 入坑HttpServletRequest.getParameterMap
  5. Unity发送短信
  6. Sublime 插件安装
  7. C++ 可以多个函数声明
  8. Java--调试--单步调试,断言,单元测试
  9. PHP cookie禁用时session 方案
  10. 利用git pull的勾子实现敏捷部署
  11. tomcat会话之持久化会话管理器
  12. 同样的so,放到不同的project中,就会报错
  13. python+opencv 运行环境搭建
  14. AutoMatic merge failed;fix conflicts and then commit the result.解决方法
  15. RxJava响应式编程,入门的HelloWorld;
  16. Noip前的大抱佛脚----考场配置
  17. centos7 卸载 gitlab
  18. 输入LPCWSTR类型字符串
  19. Nginx 作为反向代理优化要点proxy_buffering
  20. JAVA实现DIJKSTRA算法

热门文章

  1. MySQL sql join 算发
  2. java项目添加log4j打印日志+转换系统时间
  3. Python常用知识
  4. selenium 定制启动chrome的参数
  5. harbor 私有镜像仓库使用
  6. JS 的 new 到底是干什么的?
  7. 记录下我用Jenkins打包碰到的坑
  8. 一个 TCP 连接可以发多少个 HTTP 请求
  9. 使用 Linux Mint 作为主要操作系统的一些个人常用软件
  10. Embedded based learning