lua中的metatable和metamethod

--元表和元方法给lua里的值设定一些操作,让我们可以对这些操作自定义
--创建一个新的table变量时,它是不存在元表的
--在Lua中,只能设置table的元表,其他类型的值的元表,只能通过C代码来完成
local mt={}
mt.__add=function(t1,t2)print("i am result")end
local t1={}
local t2={}
setmetatable(t1,mt)
setmetatable(t2,mt)
local result=t1+t2
a={numerator=2,denominator=3}
b={numerator=4,denominator=7}

op={}--metatable
function op.__add(f1,f2)
    ret={}
    ret.numerator=f1.numerator*f2.denominator+f1.denominator*f2.numerator
    ret.denominator=f1.denominator*f2.denominator
    return ret
end

setmetatable(a,op)
setmetatable(b,op)

s=a+b
print(s.numerator,s.denominator)--26,21
时间: 2024-10-09 13:05:20

lua中的metatable和metamethod的相关文章

lua中对于metatable用法和原理的总结

<span style="font-family: Arial, Helvetica, sans-serif;">-- --metatable 可以作为继承的用法</span> parent = { house = 1 } parent.__index = parent --如果没有这一句话 child即使是设置parent为元表 也不能找到parent中的内容. __index指向的内容是nil child = { wife = 2 } setmetatabl

Lua中的元表(metatable)、元方法(metamethod)详解

在第一次看见这两样东西的时候,可能会觉得它很深奥,但其实很好理解,虽然实际上它可能真的很深奥.(小若:停!滚粗.) 1.知道为什么1 + 1 = 2吗? 为什么在Lua中,1+1会等于2呢?(小若:难道除了Lua,其他地方就不等于2了?)为什么数字和数字相加是合法的,为什么table和table相加就会报错?大家有想过这些问题吗? 没错,规则,这一切都只是规则而已,Lua规定了数字之间可以进行加减乘除,而table之间则不可以. 这是因为,在人类世界里,并没有table和table相加的概念. 

lua metatable和metamethod元表和元方法

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

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

Metatable和Metamethod(转)

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

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接

Metatable和Metamethod

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

【转载】Lua中实现类的原理

原文地址 http://wuzhiwei.net/lua_make_class/ 不错,将metatable讲的很透彻,我终于懂了. ------------------------------------------------------------ Lua中没有类的概念,但我们可以利用Lua本身的语言特性来实现类. 下文将详细的解释在Lua中实现类的原理,涉及到的细节点将拆分出来讲,相信对Lua中实现类的理解有困难的同学将会释疑. 类是什么? 想要实现类,就要知道类到底是什么. 在我看来,

[转]Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如果定义这个指定的函数,这个指定的函数时什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连