chapter 13_2 关系类、库定义的元方法
元表还可以指定关系操作符的含义,元方法为__eq ,__lt(小于) ,__le(小于等于).
而其它3个关系操作符则没有单独的元方法,Lua会
把a ~= b 转化为not(a == b)
将a>b 转化为 b < a ;
将a>=b 转化为 b <= a ;
因此需要分别为__le和__lt提供实现:
mt.__le = function(a,b) --set containment
for k in pairs(a) do
if not b[k] then return false end
end
return true
end mt.__lt = function(a,b)
return a<=b and not(b <= a)
end
最后,还可以定义集合的相等性判断:
mt.__eq = function(a,b)
return a <= b and b<=a
end
有了这些定义,可以比较集合了:
s1 = Set.new{,}
s2 = Set.new{,,}
print(s1 <= s2 ) --> true
print(s1 < s2) --> true
print(s1 >= s1) --> true
print(s1 > s1) -->false
print(s1 == s2 * s1) -->true
等于比较有一点限制,如果两个对象拥有不同的方法,那么等于操作不会调用任何一个元方法,而是直接返回false。
只有当两个比较对象共享一个元方法时,Lua才调用这个等于比较的元方法。
与算术类的元方法不同的是,关系类的元方法不能应用于混合的类型。
如果试图将一个字符串与一个数字作顺序性比较,Lua会引发一个错误。
库定义的元方法
函数tostring,它能将各种类型的值表示为一种简单的文本格式:
print({}) -->table:0x8062ac0
print函数总是调用tostring来格式化其输出。当格式化任意值时,tostring会检查该值是否有一个__tostring的元方法。
如果有这个元方法,tostring就用该值作为参数来调用这个元方法。
这个元方法工作的结果就是tostring的结果。
在集合的实例中,已定义了一个将集合表示为字符串的函数。接下来要做的就是设置元表中的__tostring字段:
mt.__tostring = Set.tostring
此后只要调用print来打印集合,print就会调用tostring函数,进而调用到Set.tostring:
s1 = Set.new{,,}
print(s1) -->{4,5,10}
函数setmetatable和getmetatable也会用到元表中的一个字段,用于保护元表。
假设想要保护集合的元表,使用户既看不到也不能修改集合的元表。那么就需要用到字段__metable。
当设置了该字段,getmetatable就会返回这个字段的值,而setmetatable则会引发一个错误:
mt.__metatable = "not your business"
s1 = Set.new{}
print(getmetatable(s1)) -->not your business
setmetatable(s1,{}) -->stdin:1:cannot change protected metatable
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》
chapter 13_2 关系类、库定义的元方法的更多相关文章
- php类的定义与实例化方法
php类的定义 类是对某个对象的定义.它包含有关对象动作方式的信息,包括它的名称.方法.属性和事件.实际上它本身并不是对象,因为它不存在于内存中.当引用类的代码运行时,类的一个新的实例,即对象,就在内 ...
- OC学习--OC中的类--类的定义,成员变量,方法
1. 类的定义 >用关键字@interface进行声名 @end 结束 >所有的类有一个基类NSobject >类名 也是标示符 第一个字母大写 如果多个字母组成 每个单词的首字母 ...
- Lua 学习笔记(十一)元表与元方法
在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...
- lua元表与元方法
lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能. lua中提供的元表是用于帮助lua变量完 ...
- lua元表和元方法 《lua程序设计》 13章 读书笔记
lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...
- lua metatable和metamethod元表和元方法
Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...
- lua编程之元表与元方法
一. 前言 lua是一种非常轻量的动态类型语言,在1993年由由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo等人 ...
- Step By Step(Lua元表与元方法)
Step By Step(Lua元表与元方法) Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表 ...
- chapter 13_3 table访问的元方法
前两节的算术类.关系类运算符的元方法都为各种错误情况定义了行为,它们不会改变语言的常规行为. 但是Lua还提供了两种可以改变table行为的方法: 一种是查询table中不存在的字段.一种是修改tab ...
随机推荐
- <hdu - 1863> 畅通工程 并查集和最小生成树问题
本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...
- C#函数以及应用
- Ansible Filter
没啥好说的. 自己看吧 http://docs.ansible.com/ansible/playbooks_filters.html
- KMP 算法 学习 整理
我自己整理的KMP算法的PDF文件:http://pan.baidu.com/s/1o8yKIi2提取密码:8291 别的就不多说啥了,感谢来自海子 博客园的 资料--
- POJ 3414 Pots(BFS)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description You are g ...
- Pelican主题配置:elegant
简介 elegant是Mac风格的优秀主题,简单,专注文章本身. A responsive, minimal, and stylish theme for Pelican:https://github ...
- pymongo数据报表脚本
最近打算将平时自己的一些小工具整理整理,由于一直使用python写脚本,而且数据库一直使用MongoDB,所以直接使用pymonogo驱动数据库做一些报表生成的小脚本,此次的脚本主要针对每个月中公司业 ...
- Scala 类和对象
Scala class: Scala 源文件中可以有很多类(class),这些类默认都是Public的,public是Scala的默认访问级别.在Scala中,声明一个未用priavate修饰的字段 ...
- Struts2中的一个类型转换示例
1.写一个属性文件,里面写好需要转换的类型数据,xwork-conversion.properties,解释: xwork-conversion.properties表示对所有action中的指定数据 ...
- Linux 虚拟机性能监控
性能监控工具 perf kvm 为了在主机中使用perf kvm,您必须访问/ proc / modules和/ proc / kallsyms文件."复制/ proc文件从guest虚拟机 ...