Lua metatable & metamethod

Lua metatable & metamethod

  Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行“+”操作。这需要我们进行一些操作。在Lua中有一个元表,也就是上面说的metatable,我们可以通过元表来修改一个值得行为,使其在面对一个非预定义的操作时执行一个指定的操作。比如,现在有两个table类型的变量a和b,我们可以通过metatable定义如何计算表达式a+b,具体的在Lua中是按照以下步骤进行的:

  1. 先判断a和b两者之一是否有元表;
  2. 检查该元表中是否有一个叫__add的字段;
  3. 如果找到了该字段,就调用该字段对应的值,这个值对应的是一个metamethod;
  4. 调用__add对应的metamethod计算a和b的值。

  Lua在创建新的table时不会创建元表

  

  可以使用setmetatable去设置一个table或userdata类型变量的元表

  

  在table中,我可以重新定义的元方法有以下几个:

  

参考:http://www.jellythink.com/archives/511

时间: 2024-10-12 16:25:50

Lua metatable & metamethod的相关文章

lua metatable和metamethod元表和元方法

Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否存在__add字段,如果有,就调用该字段对应的值.这个值就是所谓的“元方法”,这个函数用于计算table的和.    Lua中每个值都有一个元表.table和userdata可以有各自独立的元表,而其它数据类型的值则共享其类型所属的单一元表.缺省情况

lua metatable 和 _index 实验

lua metatable 和 _index 中文博客解释: http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html metatable:http://www.lua.org/pil/13.html 表的通用方法中,有些缺失的, 使用metatable可以定义表的这些默认方法: add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, ind

Metatable和Metamethod(转)

Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说"+"由metamethod来具体定义. Metatable和Metamethod大多数地方都翻译成“元表”和“元函数”,这是一种直译,相当不直观.根据Metatable的用法,我倾向于将Metatable翻译成关联表,Metamethod翻译成关联函数.通过给两个table设置Metatable

Metatable和Metamethod

根据Metatable的用法,我倾向于将Metatable翻译成关联表,Metamethod翻译成关联函数. 通过给两个table设置同一个Metatable可以使两个table产生联系,将两个table关联起来,然后对两个table进行一些操作,具体的操作行为由Metamethod来定义. 下面是一个使用关联表来对集合(用table实现的集合)进行操作的示例,实例中定义了集合的并集.交集.比较等运行: Set = {} --专门用来作为metatable,定义在Set里面以免影响外部的命名空间

lua面向对象封装及元表(metatable)性能测试

Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- file:test.lua local test = {} function test:get_x() return self.x or 0 end function test:set_x( _x ) self.x = _x end local test_module = {} function

Lua总结

ref http://book.luaer.cn/ 基础 弱类型,没有类型定义 解释型语言,但是会通过编译器先编译成中间码然后再执行 字符串的处理:用table保存,最后table.concat(t, "\n") .. "\n".防止..引起的性能问题 注释: -- 块注释:-[[ ]] 没有++,+= 打印:print(a, b, c, "", 1) 字符串:'或者"均可 或者[[包含'和"]] 不需要声明类型,语句结束不需

Lua_第 12 章 Metatables and Metamethods

第 12 章 Metatables and Metamethods Lua中的 table 由于定义的行为,我们可以对 key-value 对执行加操作,访问 key 对 应的 value,遍历所有的 key-value.但是我们不可以对两个 table 执行加操作,也不可以比较两个表的大小. Metatables 允许我们改变 table 的行为,例如,使用 Metatables 我们可以定义 Lua 如 何计算两个 table 的相加操作 a+b.当 Lua试图对两个表进行相加时,他会检查两

cc(self)是什么意思?

分别找到这2句代码: 复制代码 cc(self):addComponent("components.behavior.EventProtocol"):exportMethods() cc.GameObject.extend(self):addComponent("components.behavior.EventProtocol"):exportMethods() 所以 cc(self) 就等于调用 cc.GameObject.extend(self) . ----

lua元表(metatable)和元方法(metamethod)

元表概念: 引言:Lua中的每个值都有一套预定义的操作集合,如数字相加等.但无法将两个table相加,此时可通过元表修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作. 访问机制:一般的元方法都只针对Lua的核心,也就是一个虚拟机.它会检测一个操作中的值是否有元表,这些元表是否定义了关于次操作的元方法.例如两个table相加,先检查两者之一是否有元表,之后检查是否有一个叫“__add”的字段,若找到,则调用对应的值.“__add”等即时字段,其对应的值(往往是一个函数或是table