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+t2
a={numerator=,denominator=}
b={numerator=,denominator=}
op={}--metatable
function op.__add(f1,f2)
ret={}
ret.numerator=f1.numerator*f2.denominator+f1.denominator*f2.numerator
ret.denominator=f1.denominator*f2.denominator
return ret
end
setmetatable(a,op)
setmetatable(b,op)
s=a+b
print(s.numerator,s.denominator)--26,21
Metatable允许我们改变table的行为,例如,使用Metatables 我们可以定义Lua 如何计算两个table 的相加操作a+b。当Lua 试图对两个表进行相加时,他会检查两个表是否有一个表有Metatable,并且检查Metatable 是否有__add 域。如果找到则调用这个__add函数(所谓的Metamethod)去计算结果。
可以使用setmetatable函数设置或者改变一个表的metatable.
任何一个表都可以是其他一个表的metatable,一组相关的表可以共享一个metatable,一个表也可以是自身的metatable。
--模拟集合运算
--定义+来执行两个集合的并操作
Set={}
Set.mt={} --metatable for sets
function Set.new(t)
local set={}
setmetatable(set,Set.mt)
for _,l in pairs(t) do
set[l]=true
end
return set
end function Set.union(a,b)
local res=Set.new()
for k in pairs(a) do res[k]=true end
for k in pairs(b) do res[k]=true end
return res
end function Set.intersection(a,b)
local res=Set.new()
for k in pairs(a) do
res[k]=b[k]
end
return res
end function Set.tostring(set)
local s="{"
local sep=""
for e in pairs(set) do
s=s..sep..e
sep=","
end
return s.."}"
end function Set.print(s)
print(Set.tostring(s))
end Set.mt.__add=Set.union s1=Set.new({,,,})
s2=Set.new({,})
s3=s1+s2--这行出错,原因不清楚
--the __index metamethod
Window={}
Window.prototype={x=,y=,width=,height=,}
Window.mt={}--metatable
function Window.new(o)
setmetatable(o,Window.mt)
return o
end Window.mt.__index=Window.prototype
w=Window.new{x=,y=}
print(w.width)
lua中的metatable和metamethod的更多相关文章
- Lua中的metatable详解
转自:http://www.jb51.net/article/56690.htm Lua 中 metatable 是一个普通的 table,但其主要有以下几个功能: 1.定义算术操作符和关系操作符的行 ...
- Lua中的元表(metatable)、元方法(metamethod)详解
在第一次看见这两样东西的时候,可能会觉得它很深奥,但其实很好理解,虽然实际上它可能真的很深奥.(小若:停!滚粗.) 1.知道为什么1 + 1 = 2吗? 为什么在Lua中,1+1会等于2呢?(小若:难 ...
- [Lua快速了解一下]Lua的MetaTable和MetaMethod
MetaTable和MetaMethod是Lua中的重要的语法,MetaTable主要是用来做一些类似于C++重载操作符式的功能. 两个分数 fraction_a = {numerator=, den ...
- lua metatable和metamethod元表和元方法
Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...
- Lua中metatable和__index的联系
Lua中metatable和__index的联系 可以参考 http://blog.csdn.net/xenyinzen/article/details/3536708 来源 http://blog. ...
- Metatable和Metamethod
Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说&quo ...
- Metatable和Metamethod(转)
Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说&quo ...
- Lua中的元表与元方法
[前言] 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理 ...
- Lua中的元表和元方法
Lua中每个值都可具有元表. 元表是普通的Lua表,定义了原始值在某些特定操作下的行为.你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征.例如,当数字值作为加法的操作数时,Lua ...
随机推荐
- 利用反射给JAVABEAN实例赋值
为简化和统一,需要给javabean实例统一赋值,实现代码如下(已测试) import java.util.ArrayList; import java.util.Date; import java. ...
- Mui使用jquery并且使用点击跳转新窗口
网上好多朋友是这样做的: 全局插入了js代码 mui('body').on('tap', 'a', function () { document.location.href = this.href; ...
- 【转】Java实现将文件或者文件夹压缩成zip
转自:https://www.cnblogs.com/zeng1994/p/7862288.html package com.guo.utils; import java.io.*; import j ...
- java 利用Xstream注解生成和解析xml
https://www.oschina.net/code/snippet_116183_14202#23325
- NodeJs学习记录(二)win7下 配置node连接oracle的环境
2017/01/23 星期一 前言:还没看几眼教程,就开始分配任务,涉及到连oracle数据库,所以顺便把整个环境的配置放上来 安装文件清单(1).node-v6.9.1-x64.msi(2).pyt ...
- JavaScript(十三)面向对象
面向对象 面向对象的过程 通过new 构造函数 生成的对象来执行, 类似于事件的执行 this指向函数,然后再把这个函数赋值给一个实例 所以在函数内的this 就指到了实例上 function ...
- 短URL生成
算法原理 算法一 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略 ...
- 【sqli-labs】【jsp/tomcat】 less29 less30 less31 less32 (GET型利用HTTP参数污染的注入)
sqli-labs带了几个Java版本的web注入,在tomcat-files.zip里 以Less29为例,查看源码,可以看出请求最后还是提交给了php应用,难怪less29文件夹下有一个没有任何防 ...
- Vue核心知识-computed和watch的使用场景和方法
https://www.jianshu.com/p/bb7a2244c7ca
- CSS 类名的问题
以下以数字开头的 CSS 类名不会生效: .1st{ color: red; } 一个合法的 CSS 类名必需以下面其中之一作为开头: 下划线 _ 短横线 - 字母 a-z 然后紧跟其他 _,- 数字 ...