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中.如: -- ...
随机推荐
- jquery.vilidate的运用
vilidate是jquery的一个form表单验证插件非常实用 里面需要注意的就是remote的用法 /*验证*/$().ready(function() { $(".form_al ...
- Java并发之线程异常捕获
由于线程的本质特性,使得你不能捕获从线程中逃逸的异常,如: import java.util.concurrent.ExecutorService; import java.util.concurre ...
- react 组件的生命周期
组件的生命周期 过程 装载(Mounting) :组件被插入到 DOM 中: 更新(Updating) :组件重新渲染以更新 DOM: 卸载(Unmounting) :组件从 DOM 中移除. 过程 ...
- 安全体系(三)——SHA1算法详解
本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保 ...
- BOM基础(三)
在我之前关于DOM的文章里,其实已经有提到过事件的概念.在讲事件之前,首先要知道的就是javascript是由事件驱动的.什么叫事件驱动呢?打个比方,比如我们在页面中点击一个按钮,才会跳出一个窗口或者 ...
- 加入大型的js文件如jQuery文件,Eclipse会报错
在使用Eclipse3.7及以后的版本的时候,加入大型的js文件如jQuery文件,会报错(missing semicolon),文件中会显示红色小X,虽然这个错误并不会影响项目的运行,但是这个却会大 ...
- 1709: [Usaco2007 Oct]Super Paintball超级弹珠
1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 339 Solved: ...
- 取出关联数组的key值和values值
取出关联数组的key值,可用 array_keys()取出; <?php $a=array("Volvo"=>"XC90","BMW&qu ...
- web从入门开始(2)----基础
HTML文件结构 <html> <head>//网页头标记 <title>放置标题</title> </head> <body> ...
- 2017-3-20 HTML 基础知识
HTML的定义:HTML是一门编程语言的名字:超文本标记语言(Hyper Text Mark-up Language ),就是超越了文字的范畴,除了文字还可以有图片.视频.音频.动画.特效.表格.链接 ...