元表还可以指定关系操作符的含义,元方法为__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 关系类、库定义的元方法的更多相关文章

  1. php类的定义与实例化方法

    php类的定义 类是对某个对象的定义.它包含有关对象动作方式的信息,包括它的名称.方法.属性和事件.实际上它本身并不是对象,因为它不存在于内存中.当引用类的代码运行时,类的一个新的实例,即对象,就在内 ...

  2. OC学习--OC中的类--类的定义,成员变量,方法

    1. 类的定义 >用关键字@interface进行声名  @end 结束 >所有的类有一个基类NSobject >类名 也是标示符 第一个字母大写 如果多个字母组成 每个单词的首字母 ...

  3. Lua 学习笔记(十一)元表与元方法

    在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...

  4. lua元表与元方法

    lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能. lua中提供的元表是用于帮助lua变量完 ...

  5. lua元表和元方法 《lua程序设计》 13章 读书笔记

    lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...

  6. lua metatable和metamethod元表和元方法

    Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...

  7. lua编程之元表与元方法

    一. 前言 lua是一种非常轻量的动态类型语言,在1993年由由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo等人 ...

  8. Step By Step(Lua元表与元方法)

    Step By Step(Lua元表与元方法) Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表 ...

  9. chapter 13_3 table访问的元方法

    前两节的算术类.关系类运算符的元方法都为各种错误情况定义了行为,它们不会改变语言的常规行为. 但是Lua还提供了两种可以改变table行为的方法: 一种是查询table中不存在的字段.一种是修改tab ...

随机推荐

  1. Tiny6410之NAND FLASH驱动

    一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STE ...

  2. 【IIS】windows2008 ii7 设置访问网站提示帐号密码登录

    3个步骤: 1.添加windows身份验证: windows2008默认是不启用的,需要我们自己去启动,在管理工具 - 服务器管理- 角色 ,拉下去,下面有个[添加角色服务],安全性- Windows ...

  3. Python学习笔记——基础篇【第六周】——json & pickle & shelve & xml处理模块

    json & pickle 模块(序列化) json和pickle都是序列化内存数据到文件 json和pickle的区别是: json是所有语言通用的,但是只能序列化最基本的数据类型(字符串. ...

  4. Hadoop无法上传文件查找原因

    部署了集群,上传测试文件到HDFS文件系统的时候出现问题.could only be replicated to 0 nodes, instead of 1,如下图所示: 度娘寻找解决方案: 博客链接 ...

  5. JS中的Replace只会替换第一处解决办法

    解决这个问题只需将replace的第一个参数使用正则的方式即可,代码如下: var reg = new RegExp(",","g"); var str = & ...

  6. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  7. HDU 5868 Different Circle Permutation(burnside 引理)

    HDU 5868 Different Circle Permutation(burnside 引理) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=586 ...

  8. Oracle SQL 关键字

    1.UID返回标识当前用户的唯一整数SQL> show userUSER 为"GAO"SQL> select username,user_id from dba_use ...

  9. php自定义函数求取平方根

    <?phpfunction sqare($a, $left, $right){ $mid = ($left + $right)/2; if($mid * $mid == $a || (abs($ ...

  10. css三种布局方式

    第一种布局方式:标准流(文档流) 标准流即为元素默认的显示方式.如块级元素独占一行,行内元素可以在一行显示. 第二种布局方式:浮动,float属性 浮动对应的css属性是float:left/righ ...