chapter 13_0 元方法】的更多相关文章

通常,Lua中的每个值都有一套预定义的操作集合. 例如:可以将数字相加.可以连接字符串.可以在table中插入一对key-value等. 但是无法将两个table相加,无法对函数作比较,或无法调用一个字符串. 可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作. 例如:假设a和b都是table,通过元表可以定义如何计算表达式a + b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表. 然后检查该元表中是否有一个叫__add的字段.如果Lua找到了该…
前两节的算术类.关系类运算符的元方法都为各种错误情况定义了行为,它们不会改变语言的常规行为. 但是Lua还提供了两种可以改变table行为的方法: 一种是查询table中不存在的字段.一种是修改table中不存在的字段. __index元方法 当访问一个table中不存在的字段时,得到的结果为nil.这样的访问会促使解释器去查找一个叫__index的元方法. 如果没有这个元方法,那么访问结果就是nil. 一个有关继承的示例:假设要创建一些描述窗口的table,每个table中必须表述一些窗口参数…
元表还可以指定关系操作符的含义,元方法为__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…
假设用table来表示集合,用function去计算集合的交集.并集. 为了保持名称空间的整齐,将这些函数存入一个名为Set的table中. 现在,假设用“+”来计算两个集合的并集,那么就要让所有用于表示集合的table共享一个元表. 并且在该元表中定义如何执行一个加法操作. local mt = {} --集合的元表 function Set.new(l) local set = {} setmetatable(set,mt) for _,v in ipairs(l) do set[v] =…
在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符串.      但是,Lua提供了元表与元方法来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作.例如,假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否有一个叫__add的字段.如…
lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能. lua中提供的元表是用于帮助lua变量完成某些非预定义功能的个性化行为,如两个table的相加,通过让两者指向同一元表并修改该元表的元方法可以实现该功能. 任何table都可以成为任何值的元表,而一组相关的table也可以共享一个元表. 一些MetaMethod: __add(a, b) 对应表达式 a + b __sub(a, b) 对…
-- 1.检查是否有元表local t = {1, 2}print(getmetatable(t))     -- nilprint("----------------------")-- 2.设置元表local t = {}print(getmetatable(t))     -->nil local t1 = {}setmetatable(t, t1)print (getmetatable(t))assert(getmetatable(t) == t1)print("…
[Lua __index元方法] 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键.如果__index包含一个表格,Lua会在表格中查找相应的键. 如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数. __index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil:如果存在则由 __index 返回结果. 参考:http://www.…
lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmetatable(t)) --显示过元表 此时是nil --可以用setmetatable来设置或修改任何table的元表 t1 = {} setmetatable(t,t1) assert(getmetatable(t) == t1) 任何table可以作为任何值的元表,而一组相关的table可以共享…
版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时的问题.随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题.面向过程式的编程思想很难良好的解决这些复杂的问题,通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析.设计与编程.同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统.  但是…