MetaTable 和 MetaMethod

MetaTable:为表元素重载操作符__add(a, b) 对应表达式 a + b__sub(a, b) 对应表达式 a - b

__mul(a, b)                     对应表达式 a * b
__div(a, b)                     对应表达式 a / b
__mod(a, b)                     对应表达式 a % b
__pow(a, b)                     对应表达式 a ^ b
__unm(a)                        对应表达式 -a
__concat(a, b)                  对应表达式 a .. b
__len(a)                        对应表达式 #a
__eq(a, b)                      对应表达式 a == b
__lt(a, b)                      对应表达式 a < b
__le(a, b)                      对应表达式 a <= b
__index(a, b)                   对应表达式 a.b
__newindex(a, b, c)             对应表达式 a.b = c
__call(a, ...)                  对应表达式 a(...)

例:

ta1 = {x = 1, y = 2}
ta2 = {x = 3, y = 4}

--实现tab1+tab2 = {x=4, y=6}

ta = {}
function ta.__add(t1, t2)
temp = {}
temp.x = t1.x + t2.x
temp.y = t1.y + t2.y
return temp
end
setmetatable(ta1, ta)
setmetatable(ta2, ta)
print((ta1+ta2).x, (ta1+ta2).y)

注:setmetatable为lua库函数,用于重载lua中的操作符

实现重载的方法(用空表定义,表成员函数)将方法绑定到需要执行的表上

错误认知

ta1 = {x = 1, y = 2, __add}
ta2 = {x = 3, y = 4, __add}

--实现tab1+tab2 = {x=4, y=6}

function add(t1, t2)
temp = {}
temp.x = t1.x + t2.x
temp.y = t1.y + t2.y
return temp
end

ta1._add = add
ta2._add = add
print((ta1+ta2).x, (ta1+ta2).y)

时间: 2024-10-10 08:58:30

MetaTable 和 MetaMethod的相关文章

lua metatable和metamethod元表和元方法

Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否存在__add字段,如果有,就调用该字段对应的值.这个值就是所谓的“元方法”,这个函数用于计算table的和.    Lua中每个值都有一个元表.table和userdata可以有各自独立的元表,而其它数据类型的值则共享其类型所属的单一元表.缺省情况

Metatable和Metamethod(转)

Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说"+"由metamethod来具体定义. Metatable和Metamethod大多数地方都翻译成“元表”和“元函数”,这是一种直译,相当不直观.根据Metatable的用法,我倾向于将Metatable翻译成关联表,Metamethod翻译成关联函数.通过给两个table设置Metatable

Metatable和Metamethod

根据Metatable的用法,我倾向于将Metatable翻译成关联表,Metamethod翻译成关联函数. 通过给两个table设置同一个Metatable可以使两个table产生联系,将两个table关联起来,然后对两个table进行一些操作,具体的操作行为由Metamethod来定义. 下面是一个使用关联表来对集合(用table实现的集合)进行操作的示例,实例中定义了集合的并集.交集.比较等运行: Set = {} --专门用来作为metatable,定义在Set里面以免影响外部的命名空间

lua中的metatable和metamethod

--元表和元方法给lua里的值设定一些操作,让我们可以对这些操作自定义 --创建一个新的table变量时,它是不存在元表的 --在Lua中,只能设置table的元表,其他类型的值的元表,只能通过C代码来完成 local mt={} mt.__add=function(t1,t2)print("i am result")end local t1={} local t2={} setmetatable(t1,mt) setmetatable(t2,mt) local result=t1+t

C/C++ Lua Parsing Engine

catalog 1. Lua语言简介 2. 使用 Lua 编写可嵌入式脚本 3. 嵌入和扩展: C/C++中执行Lua脚本 4. 将C/C++函数导出到Lua引擎中: 在Lua脚本中执行C/C++函数 1. Lua语言简介 0x1: 运行 Lua是类C的,所以,他是大小写字符敏感的,同时,Lua脚本的语句的分号是可选的(和GO语言类似)可以像python一样,在命令行上运行lua命令后进入lua的shell中执行语句 也可以把脚本存成一个文件,用如下命令行来运行 0x2: 语法 1. 注释 --

Lua 与 Redis

Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.li

Lua简明教程

这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),而且能和C语言非常好的互动.我很好奇得浏览了一下Lua解释器的源码,这可能是我看过最干净的C的源码了. 我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文

Lua简易教程

首先,我们须要知道,Lua是类C的,所以,他是大写和小写字符敏感的. 以下是Lua的Hello World.注意:Lua脚本的语句的分号是可选的,这个和GO语言非常类似. 复制代码代码例如以下: print("Hello World") 你能够像python一样.在命令行上执行lua命令后进入lua的shell中执行语句. 复制代码代码例如以下: chenhao-air:lua chenhao$ lua Lua 5.2.2  Copyright (C) 1994-2013 Lua.or

Lua初学笔记

Lua初学笔记 lua动态类型语言,支持过程式编程.面向对象编程.函数式编程与数据驱动编程. lua -la -lb:命令首先在一个Chunk内先运行脚本文件a,然后运行脚本文件b.(-l参数会调用require,将会在指定的目录下搜索文件). lua -i -la -lb:参数-i要求lua运行指定Chunk后进入交互模式. 运行Chunk的另外一个方式是在交互模式下使用dofile 全局变量:全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只