lua metatable(元表)
lua metatable (元表)
概述
普通 table 类型的表仅能够做一些单表操作, 无法进行一些特殊的以及两个表的操作, 比如 table1 + table2, print(table3)
lua 的元表可以理解为一个存储操作方法的 table, 将表指定某个元表, 其实就是将一些操作绑定到了原表上
语法定义
setmetatable(table, metatable)
getmetatable(table)
示例程序
mytable1 = {name = "liao", age = 18}
mymetatable1 = {sex = "male"}
setmetatable(mytable1, mymetatable1) mytable2 = setmetatable({}, {}) metat = getmetatable(mytable1) for k, v in pairs(mytable1) do
print(k, v)
end
常用元方法
元方法有点类似于 php 的魔术方法的意思
__index
示例程序
mytable = setmetatable({k1 = "v1"}, {
__index = function(mytable, k)
if k == "k2" then
return "v2"
else
return nil
end
end
}) print(mytable.k1, mytable.k2, mytable.k3)
__newindex
示例程序
mymetatable = {}
mytable = setmetatable({k1 = "v1"}, {
__newindex = mymetatable
}) mytable.k1 = "hello"
mytable.k2 = "world" print(mytable.k1, mytable.k2, mymetatable.k1, mymetatable.k2) // 若要将赋值赋给原表, 需要使用 rawset 函数
mymetatable2 = {}
mytable2 = {k1 = "v1"} mymetatable2.__newindex = function(mytable2, k, v)
rawset(mytable2, k, v)
end
__add
示例程序
local mytable1 = {1, 2, 3}
local mytable2 = {4, 5, 6}
local mymetatable = {} // 将 t2 的数据加入 t1
mymetatable._add = function(t1, t2)
for i = 1, #t2 do
table.insert(t1, #t1 + 1, t2[i])
end return t1
end setmetatable(mytable1, mymetatable) local mytable3 = mytable1 + mytable2 for k, v in pairs(mytable3) do
print(k, v)
end
__sub
示例程序
local mytable1 = {1, 2, 3, 4, 5, 6}
local mytable2 = {2, 3}
local mymetatable = {} function removeFromTable(t, val)
for k, v in pairs(t) do
if v == val then
table.remove(t, k)
end
end return t
end mymetatable.__sub = function(t1, t2)
for i = 1, #t2 do
t1 = removeFromTable(t1, t2[i])
end return t1
end setmetatable(mytable1, mymetatable) local mytable3 = mytable1 - mytable2 for k, v in pairs(mytable3) do
print(k, v)
end
__mul
示例程序
local mytable1, mytable2, mymetatable = {1, 2, 3}, {4, 5}, {} mymetatable.__mul = function(t1, t2)
for i = 1, #t1 do
local m1, m2 = t1[i], t2[i]
if not m2 then
m2 = 1
end t1[i] = m1 * m2
end return t1
end setmetatable(mytable1, mymetatable) local mytable3 = mytable1 * mytable2 for k, v in pairs(mytable3) do
print(k, v)
end
__div
示例程序
local t1, t2, meta = {10, 9, 8}, {5, 4}, {} meta.__div = function(t1, t2)
for i = 1, #t1 do
local d1, d2 = t1[i], t2[i]
if not d2 then
d2 = 1
end
t1[i] = d1 / d2
end return t1
end setmetatable(t1, meta) local t3 = t1 / t2 for k, v in pairs(t3) do
print(k, v)
end
__mod
示例程序
local t1, t2, meta = {10, 9, 8}, {5, 4}, {} meta.__mod = function(t1, t2)
for i = 1, #t1 do
if not t2[i] or t2[i] == 0 then
break
end
t1[i] = t1[i] % t2[i]
end return t1
end setmetatable(t1, meta) local t3 = t1 % t2 for k, v in pairs(t3) do
print(k, v)
end
__unm
示例程序
local t1, meta = {1, 2, 3}, {} meta.__unm = function(t1)
for i = 1, #t1 do
t1[i] = -t1[i]
end return t1
end setmetatable(t1, meta) local t3 = -t1 for k, v in pairs(t3) do
print(k, v)
end
__concat
示例程序
local t1, t2, meta = {1, 2, 3}, {4, 5, 6}, {} meta.__concat = function(t1, t2)
for i = 1, #t1 do
t1[i] = t1[i] .. t2[i]
end return t1
end setmetatable(t1, meta) local t3 = t1 .. t2 for k, v in pairs(t3) do
print(k, v)
end
__eq
示例程序
local t1, t2, meta = {1, 2, 3}, {1, 2, 3}, {} meta.__eq = function(t1, t2)
for i = 1, #t1 do
if t1[i] ~= t2[i] then
return false
end
end return true
end setmetatable(t1, meta) local compare = t1 == t2 print(compare)
__lt
示例程序
local t1, t2, meta = {1, 2, 3}, {4}, {} meta.__lt = function(t1, t2)
local sum1, sum2 = 0, 0
for i = 1, #t1 do
sum1 = sum1 + t1[i]
end for i = 1, #t2 do
sum2 = sum2 + t2[i]
end if sum1 < sum2 then
return true
else
return false
end
end setmetatable(t1, meta) local compare = t1 < t2 print(compare)
__le
示例程序
local t1, t2, meta = {1, 2, 3}, {1, 2, 3}, {} meta.__le = function(t1, t2)
local sum1, sum2 = 0, 0
for i = 1, #t1 do
sum1 = sum1 + t1[i]
end for i = 1, #t2 do
sum2 = sum2 + t2[i]
end if sum1 <= sum2 then
return true
else
return false
end
end setmetatable(t1, meta) local compare = t1 <= t2 print(compare)
__call
示例程序
local t1, t2, meta = {1}, {2, 3}, {} meta.__call = function(t1, t2)
local sum = 0
for i = 1, #t1 do
sum = sum + t1[i]
end for i = 1, #t2 do
sum = sum + t2[i]
end return sum
end setmetatable(t1, meta) local sum = t1(t2) print(sum)
__tostring
示例程序
local t1, meta = {1, 2, 3}, {} meta.__tostring = function(t)
local str = ''
for i = 1, #t do
str = str .. t[i] .. "###"
end return str
end setmetatable(t1, meta) print(t1)
lua metatable(元表)的更多相关文章
- lua metatable和metamethod元表和元方法
Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...
- Lua metatable & metamethod
[Lua metatable & metamethod] Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行“+”操 ...
- lua metatable 和 _index 实验
lua metatable 和 _index 中文博客解释: http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html metatabl ...
- Lua的元表(metatable)
metatable允许我们改变table的行为 > Lua中的每一个表都可以有metatable(后面我们将看到userdata也有Metatable) > Lua默认创建一个不带meta ...
- Lua之元表
Lua之metatable 一.元表 Lua中的每个值都有一套预定义的操作集合,也可以通过metatable(元表)来定义一个值的行为,metatable包含了一组meatmethod(元方法). L ...
- Lua中元表的学习
--table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作. --元表(Metatable),允许我们改变table的行为,可以对两个table进行操作 -- ...
- lua 的元表与元方法
1. 元表与元方法, 相当于C++的函数重载 参考链接: https://blog.csdn.net/yueya_shanhua/article/details/52233228
- Scala代码开发 metaTable(元表)
使用Scala语言开发时,自动生成get和set方法 不用写return进行返回, 因为它的最后一行就是返回值 先建立四个层(层层递进) domain 表结构的建立 repository(DAO) 实 ...
- lua面向对象封装及元表(metatable)性能测试
Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...
随机推荐
- php 实现购物车功能,以大苹果购物网为例,上图上代码。。。。
首先是几个简单的登录页面 <body> <form action="chuli.php" method="post"> <div ...
- Hibernate乐观锁和悲观锁
Hibernate支持两种锁机制: 即通常所说的"悲观锁(Pessimistic Locking)"和 "乐观锁(OptimisticLocking)". 悲观 ...
- 基于JAVA语言的selenium测试基础总结
目录一.基本语句1.循环控制(break,continue)3.字符的替换(replace,repalceFirst,replaceAll,regex)4.字符串的连接("+",a ...
- 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 机器学习基石 2 Learning to Answer Yes/No
机器学习基石 2 Learning to Answer Yes/No Perceptron Hypothesis Set 对于一个线性可分的二分类问题,我们可以采用感知器 (Perceptron)这种 ...
- android:layout_gravity和android:gravity属性的区别1
一.介绍: gravity的中文意思就是"重心",就是表示view横向和纵向的停靠位置 (1).android:gravity:是对view控件本身来说的,是用来设置view本身的 ...
- mysql语句sum求和为null的问题
select sum(price) as price from order where status='SUCCESS'; 如果price对应的所有的值为0,那么算出来的和为null: 可以采用ifn ...
- Jmeter添加监控指标
需要监控的机器上安装Server-Agency(需要java环境支持)把ServerAgent-2.2.1.zip拷到需要监控的机器上,解压Linux启动如下2. Jmeter上添加监控最终有如下指标 ...
- JDBC调用存储过程的例子
下面是我学到了Oracle存储过程,在这里跟大家简单的分享一下利用JDBC调用存储过程的例子: 废话就不啰嗦,现在就直接上机代码. 首先我利用的是Oracle中默认的 scott 数据库里的 emp员 ...
- ATL dll注册失败
“生成”->“生成解决方案”或“重新生成解决方案”,在注册时,报错:regisvr32 /r/c " C:\Users\Administrator\Desktop\复件DrvWater ...