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 ...
随机推荐
- [其他]Android SDK离线文件路径以及安装更新方法
一.离线安装Android SDK文件路径 转载自:http://www.oschina.net/code/snippet_1539302_45940 Google TV Addon, Android ...
- ajax客户端请求与服务端响应浅谈
AJAX,即Asynchronous Javascript And XML,AJAX本质是在HTTP协议的基础上以异步的方式与服务器进行通信. 所谓的异步,是指某段程序执行不会阻塞其他程序执行,其表现 ...
- php stdClass类的用法
stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候任何地方都可以被new,可以让这个变量成为一个object.同时,这个基类又有一个特殊的地方,就是没有方法.凡时用new st ...
- JsSIP.UA.JsSIP 总是返回错误:422 Session Interval Too Small
在JsSIP 中 JsSIP.UA.call 总是 返回错误:422 Session Interval Too Small 关于错详情在这篇文章中解释的比较详尽:http://www.cnblogs. ...
- <hdu - 3999> The order of a Tree 水题 之 二叉搜索的数的先序输出
这里是杭电hdu上的链接:http://acm.hdu.edu.cn/showproblem.php?pid=3999 Problem Description: As we know,the sha ...
- css background-attachment属性
前提是定义了background-image属性,然后用background-attachment来指明背景图的位置是固定于视口的,还是随着包含块移动的.可简单理解为定义背景图片随滚动轴的移动方式. ...
- NSRange:NSMakeRange
NSRange:NSMakeRange(6, cardNo.length - 10) [cardNo stringByReplacingCharactersInRange:NSMakeRange(6, ...
- javascript函数作用域实践
在es6之前,JavaScript是没有块级作用域的,只有函数作用域,也就是说是一个function里面定义的变量外面取不到的:而if for是条件判断的语句,不是函数,由于缺少块级作用域,所以条件中 ...
- python学习第一天内容整理
.cnblogs_code { width: 500px } 一.python 的历史 (摘自百度百科,了解就ok) Python[1] (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn ...
- A. Alyona and Numbers(CF ROUND 358 DIV2)
A. Alyona and Numbers time limit per test 1 second memory limit per test 256 megabytes input standar ...