元表理解起来比较抽象,但这是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. 牛客练习赛53 (C 富豪凯匹配串) bitset

    没想到直接拿 bitset 能过 $10^8$~ code: #include <bits/stdc++.h> #define N 1004 #define setIO(s) freope ...

  2. 3-2新建Photoshop图像

    http://www.missyuan.com/thread-350740-1-1.html   [CTRL N][文件 新建] 按住CTRL双击Photoshop的空白区(这个好像是打开文件){快捷 ...

  3. storm java环境变量设置

    storm启动时会加载conf/storm-env.sh文件 编辑 conf/storm-env.sh 添加export JAVA_HOME=/usr/java/jdk1.8.0_111

  4. Java并发指南8:AQS中的公平锁与非公平锁,Condtion

    一行一行源码分析清楚 AbstractQueuedSynchronizer (二) 转自https://www.javadoop.com/post/AbstractQueuedSynchronizer ...

  5. ubuntu 无法访问windows使用的磁盘

    安装双系统的电脑,正常情况下Ubuntu是可以访问windows下使用的磁盘的, 当出现如下图所示问题时: Windows没有正常关闭. 解决方法: sudo apt-get install ntfs ...

  6. Flutter移动电商实战 --(35)列表页_上拉加载更多制作

    右侧列表上拉加载配合类别的切换 上拉加载需要一个page参数,当点击大类或者小类的时候,这个page就要变成1 provide内定义参数 首先我们需要定义一个page的变量 下图是我们之前在首页的时候 ...

  7. shell cat 用法

    cat命令的用途是连接文件或标准输入并打印. 1.命令格式:cat [选项] [文件]... 2.命令功能:cat主要有三大功能:1.一次显示整个文件:cat filename   --常用来显示文件 ...

  8. C#问答题与附解收集(三)

    post.get的区别 答: GET把参数包含在URL中,POST通过request body传递参数.GET请求在URL中传送的参数是有长度限制的,而POST没有.使用post提交的页面在点击[刷新 ...

  9. protected-broadcast 规范使用系统应用组件自定义广播

    1. protected-broadcast 规范使用系统应用组件自定义广播 参考:https://blog.csdn.net/TaylorPotter/article/details/7019424 ...

  10. linux下如何批量替换多个文件中的某个字符串?

    答: sed -i "s/<old_string>/<new_string>/g" `grep "<old_string>" ...