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

 

lua 元表Metatable (六)的更多相关文章

  1. lua元表(metatable)和元方法(metamethod)

    (一) 元表概念: 引言:Lua中的每个值都有一套预定义的操作集合,如数字相加等.但无法将两个table相加,此时可通过元表修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作. 访问机制 ...

  2. lua元表Metatable

    Lua 中的每个值都可以用一个 metatable. 这个 metatable 就是一个原始的 Lua table , 它用来定义原始值在特定操作下的行为. 你可以通过在 metatable 中的特定 ...

  3. 学习Lua setmetatable Lua 元表

    Lua 元表(Metatable) 在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作. 个人理解,这个相当于其他语言的继承,是把这个类的方法 ...

  4. Lua的元表(metatable)

    metatable允许我们改变table的行为 > Lua中的每一个表都可以有metatable(后面我们将看到userdata也有Metatable) > Lua默认创建一个不带meta ...

  5. lua面向对象封装及元表(metatable)性能测试

    Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...

  6. [转]LUA元表

    lua元表和元方法 <lua程序设计> 13章 读书笔记 lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在 ...

  7. Lua中metatable和__index的联系

    Lua中metatable和__index的联系 可以参考 http://blog.csdn.net/xenyinzen/article/details/3536708 来源 http://blog. ...

  8. lua——元表、元方法、继承

    [元表] 元表中的键为事件(event),称值为元方法(metamethod). 通过函数getmetatable查询不论什么值的元表,通过函数setmetatable替换表的元表. setmetat ...

  9. lua 14 metatable (类似操作符重载)

    转自:http://www.runoob.com/lua/lua-metatables.html 感性认识: “Lua中Metatable这个概念, 国内将他翻译为元表. 元表为重定义Lua中任意一个 ...

随机推荐

  1. Asia-Jakarata 2018

    目录 Contest Info Solutions Problem A. Edit Distance Problem C. Smart Thief Problem D.Icy Land Problem ...

  2. c#简单的SQLHelp

    public abstract class SQLHelper { //只读的静态数据库连接字符串 //需添加引用System.Configuration; public static readonl ...

  3. spring相关知识点易错

    1.spring不支持静态变量注入,即不能再static变量上面加@Resoure 要是想注入的话就用set方法注入 private static ComboPooledDataSource pool ...

  4. Git基础命令学习

    Git是项目代码管理软件 主要管理逻辑如下: 所有代码保存在远程,本地获取远程代码保存在本地仓库,并于本地工作目录修改代码 修改完成后,提交到本地暂存区,添加必要注释,再尝试提交到远程仓库 若发生冲突 ...

  5. JavaWeb_(Mybatis框架)MyBatis整合Spring框架

    MyBatis + Spring整合开发 a)使用Spring容器用单例模式管理Mybatis的sqlSessionFactory:b)使用Spring管理连接池.数据源等:c)将Dao/Mapper ...

  6. Flask模拟实现CSRF攻击的方法

    https://www.jb51.net/article/144371.htm https://www.cnblogs.com/888888CN/p/9489345.html http://xiaor ...

  7. BUUCTF-writeup

    Reverse RSA 使用openssl模块 rsa -pubin -text -modulus -in pub.key得到n值,在 factordb.com上分解大素数得到p,q值,脚本生成pri ...

  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_15-页面静态化-模板管理-模板管理业务流程

    在视频教学的过程中,不会去做模板管理的模块 cms_template用来存储模板信息 cms_page 这一些课程页面用的是一个模板 模板的详情.templateFileId是模板的文件id 模板的文 ...

  9. RegexBuddy 4.7.0 x64 评估试用到期,无限试用的办法

    http://www.cnblogs.com/inrg/p/6491043.html 最后对比发现,在注册表 HKEY_USERS 节点下存在一个用户的项,形如 "S-1-5-21-1609 ...

  10. vs 扩展和更新下载的插件在什么位置呢,看看吧,哈哈

    C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\10.0\Extensions,注意哈,这个AppData是隐藏的哟,要显示才能 ...