元表理解起来比较抽象,但这是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. js中错误处理机制

    1.基本知识 1. 错误对象 Error,SyntaxError,RangeError, ReferenceError,TypeError,URIError 上面的都是构造函数: new 命令可以生成 ...

  2. Oracle 11.2 静默安装脚本

    Oracle 11.2 静默安装脚本 cat db_init.sh.20190401 #!/bin/bash####安装Oracle所需依赖包function install_yum(){  yum ...

  3. web超大文件上传

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  4. 路由器配置——PAP与CHAP认证

    一.实验目的:掌握PAP与CHAP认证配置 二.拓扑图: 三.具体步骤配置: (1)R1路由器配置: Router>enable  --进入特权模式 Router#configure termi ...

  5. 【luoguSP3267】--莫队,不同数字个数

    题意翻译 给出一个长度为n 的数列,a1​​ a2​​ ,...an​ ,有q 个询问,每个询问给出数对(i,j),需要你给出ai​​ ai+1​​ ,...,aj​​ 这一段中有多少不同的数字 题目 ...

  6. busTrace VS HW protocol analyzer - 好东西推荐

    最近在找PCIe/NVMe协议分析仪,发现一款软件分析仪:busTRACE,非常不错的工具,对于从事协议开发的同胞们,是个福利,下面把硬件和软件两种分析仪的各自的优势比较了一下(来自busTrace文 ...

  7. Ubuntu18.04安装和配置Django,并实现简单示例

    一.前言(系统,django介绍,window.mac.linux简单区别) Django是python开发过程最重要的web框架.因为在看的Django教学视频是在mac下安装的,我自己用的是Lin ...

  8. ICEM-五通孔管

    原视频下载地址:https://yunpan.cn/cqaQ2t5DrRcKa  访问密码 d111

  9. 【转】CAtlRegExp class .

    CAtlRegExp Class   CAtlRegExp 类用于表示并处理正则表达式.模板类,定义如下:     template < class CharTraits = CAtlRECha ...

  10. Maven:element '******' cannot have character [children]

    此错误是由于XML文件的解析不正确造成的,因为在一个/某些标签之间存在奇怪和隐藏的字符. 这些字符可能来自网络上的复制粘贴.要解决此问题,请删除标签>标记定义之间的所有空格和换行符,然后将它们放 ...