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. Alamofire源码解读系列(五)之结果封装(Result)

    本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...

  2. 警惕!MySQL成数据勒索新目标

    据最新报道显示,继MongoDB和Elasticsearch之后,MySQL成为下个数据勒索目标,从2月12日凌晨开始,已有成百上千个开放在公网的MySQL数据库被劫持,删除了数据库中的存储数据,攻击 ...

  3. Selenium 显示等待和隐式等待

    1. 设置显示等待 Java代码: 1 2 3 4 5 public static WebElement WaitForElement(WebDriver driver, String locator ...

  4. tp框架基础(详细步骤分解,易懂)下

    在浏览器中如果要访问操作方法的时候以什么方式来访问 有四种方式 第一种是get方式,第二种是访问路径 这四种方式我们可以通过修改配置文件来改掉url的模式 我们需要来改一下我们的配置文件 在这个路径下 ...

  5. Intelligent idea高效实用总结

    一直使用eclipse,最近才转到idea IDE上面来,的确从效率等多个角度,idea都要优于eclipse.由于刚实用idea,不是很熟练,将常用的技巧总结集锦一下,方便以后查看,慢慢积累吧 一. ...

  6. Android中的WebView实战详解(二)

    四.如何用WebView下载软件? 四.如何用WebView下载软件? public class MainActivity extends AppCompatActivity { private We ...

  7. iOS最好用的弹出框

    重构项目时发现有的时候需要弹出提示,比如登录成功,数据请求失败,还有选择相机或者相册来上传头像等等. 今天就自己写了一个弹出框,采用的是系统的UIAlertController,只不过自己有定义了一些 ...

  8. ansj 2.0.7 错误例子分析

    我在做一个solr的项目,分词选定了ansj分词. 选择ansj的原因: 1)身边若干朋友的念叨,说是效果不错 2)网上看了若干评论,说是不错 3)自己尝试了一些case,觉得确实不错. 好了,项目中 ...

  9. Java引领新生活

    阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我觉得师生关系应当是亲密无间,课上老师讲解学生配合,课下师生交流启发思考. 你有什么技能(学习,棋类,球类,乐器,艺术,游戏,......)比大多 ...

  10. JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    本篇博客就完整的来聊一下如何在Eclipse中创建的Maven Project.本篇博客是JavaEE开发的开篇,也是基础.本篇博客的内容干货还是比较多的,而且比较实用,并且都是采用目前最新版本的工具 ...