Lua中的元表和元方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Lua中的元表和元方法

Lua中的元表和元方法 Posted on 2009-09-01 16:13 白耘 阅读(227) 评论(0) 编辑 收藏 所属分类: Lua学习笔记 Lua中每个值都可具有元表。 元表是普通的Lua表,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。例如,当数字值作为加法的操作数时,Lua检查其元表中的__add字段是否有个函数。如果有,Lua调用它执行加法。 我们称元表中的键为事件(event),称值为元方法(metamethod)。前述例子中的事件是add,元方法是执行加法的函数。 可通过函数getmetatable查询任何值的元表。 可通过函数setmetatable替换表的元表。不能从Lua中改变其他类型的元表(除了使用调试库);必须使用C API才能做到。 表和完整的用户数据具有独立的元表(尽管多个表和用户数据可共享元表);每种其他类型的所有值共享一个元表。所以,所有数字共享一个元表,字符串也是,等等。 元表可以控制对象的数学运算、顺序比较、连接、取长、和索引操作的行为。元表也能定义用户数据被垃圾收集时调用的函数。Lua给这些操作的每一个都关联了称为事件的特定键。当Lua对某值执行其中一个操作时,检查该值是否含有元表以及相应的事件。如果有,与该键关联的值(元方法)控制Lua如何完成操作。 元表控制后面列举的操作。每个操作由相应的名字标识。每个操作的键是由其名字前缀两个下划线“__”的字符串;例如,操作“加(add)”的键是字符串__add。这些操作的语义通过一个Lua函数描述解释器如何执行操作作了更好的说明。 下面显示的Lua代码只是说明性的;真实的行为被硬编码到解释器中,并且比这里的模拟更加高效。这些描述中的所有函数(rawget、tonumber等等。)在§5.1中描述。特别一提,要获取给定对象的元方法,我们使用表达式 metatable(obj)[event] 它应被解读为 rawget(getmetatable(obj) or {}, event) 就是说,访问一个元方法不会调用其他元方法,而且访问没有元表的对象不会失败(只是结果为nil)。 add: + 操作。 下面的getbinhandler函数定义Lua如何选择二元操作的处理程序。首先尝试第一操作数,如果它的类型没有定义该操作的处理程序,则尝试第二操作数。 function getbinhandler (op1, op2, event) ?return metatable(op1)[event] or metatable(op2)[event]???? end 通过应用该函数,op1 + op2的行为是 function add_event (op1, op2) ?local o1, o2 = tonumber(op1), tonumber(op2) ?if o1 and o2 then? -- 两操作数都是数字 ??return o1 + o2?? -- ‘+’此处是‘add’的原语 ?else? -- 至少一个操作数不是数字? ??local h = getbinhandler(op1, op2, __add) ??if h then??? -- 用两个操作数调用处理程序 ???return (h(op1, op2))? ??else? -- 没有可用的处理程序:缺省行为 ???error(...) ??end?????? ?end end sub: - 操作。 行为类似于“add”操作。 mul: * 操作。 行为类似于“add”操作。 div: / 操作。 行为类似于“add”操作。 mod: % 操作。 行为类似于“add”操作。以o1 - floor(o1/o2)*o2为操作原语。 pow: ^ (取幂)操作。 行为类似于“add”操作,以函数pow(来自C数学库)为操作原语。 unm: 一元-操作。 function unm_event (op) ?local o = tonumber(op) ?if o then? -- 操作数是数字? ??return -o? -- ‘-’此处是‘unm’的原语 ?else? -- 操作数不是数字 ?-- 尝试由操作数取得处理程序。 ??local h = metatable(op).__unm ??if h then-- 用操作数调用处理程序 ???return (h(op)) ??else? -- 没有可用的处理程序:缺省行为??? ???error(...)? ??end ?end???? end concat: .. (连接)操作。 function concat_even

文档评论(0)

asd522513656 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档