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 ...
随机推荐
- AppConfig 操作简易封装
using System; using System.Configuration; namespace HT.IMS.Common { public class ClientConfig { ; pu ...
- 273 Integer to English Words 整数转换英文表示
将非负整数转换为其对应的英文表示,给定的输入是保证小于 231 - 1 的.示例:123 -> "One Hundred Twenty Three"12345 -> & ...
- 滚动时sticky nav
参考w3c <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <met ...
- Web应用程序的安全性问题依其存在的形势划分,种类繁多,这里不准备介绍所有的,只介绍常见的一些。
Web应用程序的安全性问题依其存在的形势划分,种类繁多,这里不准备介绍所有的,只介绍常见的一些. 常见Web应用安全问题安全性问题的列表: 1.跨站脚本攻击(CSS or XSS, Cross Si ...
- HanLP自然语言处理包开源(包含源码)
支持中文分词(N-最短路分词.CRF分词.索引分词.用户自定义词典.词性标注),命名实体识别(中国人名.音译人名.日本人名.地名.实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换, ...
- spring加载classpath与classpath*的区别别
1.无论是classpath还是classpath*都可以加载整个classpath下(包括jar包里面)的资源文件. 2.classpath只会返回第一个匹配的资源,查找路径是优先在项目中存在资源文 ...
- (转)WKT转换工具terraformers
http://blog.csdn.net/gisshixisheng/article/details/53150111 概述: 前面的文章中,提到了Arcgis中实现wkt转换为geometry,但是 ...
- gym101673G. A Question of Ingestion (DP)
题意:有最多100天 每天有一个食物量 你一开始有一个最大胃口表示你最开始能吃多少食物 如果你昨天吃了 那么今天的胃口为昨天的2/3 如果你前天吃了 昨天没吃 那么你的胃口可以恢复到前天的情况 如果你 ...
- 关闭的语句: next、关闭的 Resultset: next、关闭的连接: next问题
如果在rs.next()之前关闭了Statement或PreparedStatement,会导致下面的异常: java.sql.SQLException: 关闭的语句: next 如果在rs.next ...
- no bundle URL present in react-native?
Assuming that you are using nvm and multiple versions of node installed, here is the solution: Say t ...