--元表和元方法给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)

最新文章

  1. Oracle AWR报告提取方法
  2. VIM编辑器简单总结
  3. Python中的random模块,来自于Capricorn的实验室
  4. Web持久化存储Web SQL、Local Storage、Cookies(常用)
  5. Java学习笔记(一)——HelloWorld
  6. WordPress学习
  7. [问题2014A05] 解答
  8. 写给IOS开发工程师的网页前端入门笔记
  9. mysql中文乱码问题
  10. 【转】object标签和embed标签
  11. HTML前端技术(JS的使用,包括数组和字符串)
  12. Linux硬链接和软连接详解
  13. 使用git-flow来帮助管理git代码
  14. Mongodb for .Net Core 驱动的应用
  15. Spark性能优化指南-高级篇
  16. kindle試玩
  17. Info.plist的CFBundleIdentifier、CFBundleName、BundleDisplayName
  18. POJ2230 Watchcow
  19. [原]unity调Android(三)
  20. PHP设计模式系列 - 工厂模式

热门文章

  1. C# 文件压缩方法
  2. 301 Remove Invalid Parentheses 删除无效的括号
  3. 1、DOS基本命令
  4. scala学习笔记3:基本控制结构基础
  5. MySQL客户端导入数据库脚本,字段值出现乱码解决方法
  6. GEO/SRA数据库
  7. Pytorch 加载保存模型【直播】2019 年县域农业大脑AI挑战赛---(三)保存结果
  8. ThinkPHP---thinkphp实用项
  9. mac install telnet
  10. jquery 实现点评标签 类似淘宝大众点评的 快速准时 货品完好等