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(元表)的更多相关文章

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

    Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...

  2. Lua metatable & metamethod

    [Lua metatable & metamethod] Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行“+”操 ...

  3. lua metatable 和 _index 实验

    lua metatable 和 _index 中文博客解释: http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html metatabl ...

  4. Lua的元表(metatable)

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

  5. Lua之元表

    Lua之metatable 一.元表 Lua中的每个值都有一套预定义的操作集合,也可以通过metatable(元表)来定义一个值的行为,metatable包含了一组meatmethod(元方法). L ...

  6. Lua中元表的学习

    --table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作. --元表(Metatable),允许我们改变table的行为,可以对两个table进行操作 -- ...

  7. lua 的元表与元方法

    1. 元表与元方法, 相当于C++的函数重载 参考链接: https://blog.csdn.net/yueya_shanhua/article/details/52233228

  8. Scala代码开发 metaTable(元表)

    使用Scala语言开发时,自动生成get和set方法 不用写return进行返回, 因为它的最后一行就是返回值 先建立四个层(层层递进) domain 表结构的建立 repository(DAO) 实 ...

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

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

随机推荐

  1. 算法笔记_066:Kruskal算法详解(Java)

    目录 1 问题描述 2 解决方案 2.1 构造最小生成树示例 2.2 伪码及时间效率分析 2.3 具体编码(最佳时间效率)   1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小 ...

  2. Objective-C日记-之编码对象属性

    NSCoder类 1,概述 将对象的实例变量和其他数据编码为数据块,然后将他们存在到磁盘当中:以后将这些数据块读回到内存中,并且还基于保存的数据创建新的对象,也称序列化或反序列化. 2,用法 a,首先 ...

  3. ajax 提交表单(文件)

    废话不多说,自己看代码 引入的jquery <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js&quo ...

  4. mybatis 使用场景

    1.Database design is often a separate function (with separate management) from OO domain design 数据库设 ...

  5. yii2 Nav::widget() 和 Menu::widget()

    Nav::widget http://www.yiiframework.com/doc-2.0/yii-bootstrap-nav.html Menu::widget()  http://www.yi ...

  6. 启动tomcat直接报错:org.apache.tomcat.util.digester.Digester startElement

    今天很奇怪,自己手动搭建了一个ssm(spring+springmvc+mybatis)的项目,然后添加到tomcat下,启动直接报错: 2017-3-19 9:24:47 org.apache.to ...

  7. 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  8. (8)集合之List,ArrayList,LinkedList

    集合的体系结构 Collection 单列集合的接口 |----List 如果实现了List接口的集合类,具备的特点是有序,可重复 |----Set 如果实现了Set接口的集合类,集合特点无序不可重复 ...

  9. Swift应用案例 2.闭包入门到精通

      本文主要介绍Swift的闭包的使用并与OC的Block做比较.学习Swift是绕不过闭包的,因为无论是全局函数还是嵌套函数都是闭包的一种,本文主要介绍闭包表达式. 1.闭包表达式的使用 // 1. ...

  10. Realm数据库的简单介绍和使用

    给大家介绍一个数据库操作的框架Realm,本文主要以iOS 平台的使用场景为例. realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android: ...