lua 元表与元方法示例

-- 1、检查是否有元表
local t = {1, 2}
print(getmetatable(t))     -- nil
print("----------------------")
-- 2、设置元表
local t = {}
print(getmetatable(t))     -->nil

local t1 = {}
setmetatable(t, t1)
print (getmetatable(t))
assert(getmetatable(t) == t1)
print("----------------------")
-- 3、常用元方法
--[[
__add(a, b) --加法
__sub(a, b) --减法
__mul(a, b) --乘法
__div(a, b) --除法
__mod(a, b) --取模
__pow(a, b) --乘幂
__unm(a) --相反数
__concat(a, b) --连接
__len(a) --长度
__eq(a, b) --相等
__lt(a, b) --小于
__le(a, b) --小于等于
__index(a, b) --索引查询
__newindex(a, b, c) --索引更新(PS:不懂的话,后面会有讲)
__call(a, ...) --执行方法调用
__tostring(a) --字符串输出
__metatable --保护元表
--]]

local tmeta_complext= {}
local TComplex={}
function TComplex.new(a,b)
    tComplex = {a,b}
    setmetatable(tComplex, tmeta_complext)
    return tComplex
end

function TComplex.add(c1,c2)
    tcomplext = {0,0}
    setmetatable(tcomplext, tmeta_complext)
    if c1 and c1[1] and type(c1[1]) == "number" then
        tcomplext[1] = tcomplext[1] + c1[1]
    end
    if c1 and c1[2] and type(c1[2]) == "number" then
        tcomplext[2] = tcomplext[2] + c1[2]
    end
    if c2 and c2[1] and type(c2[1]) == "number" then
        tcomplext[1] = tcomplext[1] + c2[1]
    end
    if c2 and c2[2] and type(c2[2]) == "number" then
        tcomplext[2] = tcomplext[2] + c2[2]
    end
    return tcomplext
end

function TComplex.concat(c1,c2)
    return TComplex.add(c1,c2)
end

function TComplex.tostring(c1)
    return "{" ..c1[1]..","..c1[2].."}"
end

function TComplex.print(t)
    print (TComplex.tostring(t))
end

tmeta_complext.__add = TComplex.add
tmeta_complext.__tostring = TComplex.tostring
tmeta_complext.__index = function(t, k)
    return "hei..hei, not accessiable"
end
tmeta_complext.__newindex = function (t, k, v)
    print("Attempt to update a read-only field.")
end
local t3 = TComplex.new(3,1)
local t4 = TComplex.new(4,1)

t4 = t3 + t4
TComplex.print(t4)
print (t4)
print (TComplex.tostring(t3))
print (t3[1],t3[6])
t3[6] = 7
print (t3[1],t3[6])

时间: 2024-11-07 23:46:52

lua 元表与元方法示例的相关文章

lua——元表、元方法、继承

[元表] 元表中的键为事件(event),称值为元方法(metamethod). 通过函数getmetatable查询任何值的元表,通过函数setmetatable替换表的元表. setmetatable(只能用于table)和getmetatable(用于任何对象) 语法:setmetatable (table, metatable),对指定table设置metatable      [如果元表(metatable)中存在__metatable键值,setmetatable会失败] 语法:tm

lua元表与元方法

lua中每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行"+"操作.这需要我们进行一些操作.在lua中有一个元表(metatable),我们可以通过元表来改变一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作.比如,现在有两个table类型的变量a和b,我们可以通过metatable定义如何计算表达式a+b,具体的在Lua中是按照以下步骤进行的: 1.先判断a和b两者之一是否有元表 2.检查该元表中是否有一

lua编程之元表与元方法

一. 前言 lua是一种非常轻量的动态类型语言,在1993年由由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo等人发明,lua的设计目标是轻便地嵌入宿主语言,增强系统的可扩展性和可定制性.lua的源码只有两万余行,非常精简小巧,在目前的脚本引擎中,lua的速度是最快的,这也是lua进入程序设计语言前20名,如今已经广泛应用于游戏行业,这几篇文章将会讨论下lua的几个比较重要的特性. 一门语言的类型系统是其最根本

lua metatable和metamethod元表和元方法

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

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

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

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

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

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

在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符串. 但是,Lua提供了元表与元方法来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作.例如,假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否有一个叫__add的字段.如果找到了该

LUA Learning Note 6: 元表与元方法

--元表:是用来存放无方法的一个table. --table和userdata可以各种拥有独立的元表. 但是,其他类型的值就只能共享其类型所属的元表,比如,数字,所有的数字都共用一个元表. --元方法:用来进行table 类型变量进行特殊操作的一个方法. --Lua其实已经规定好了各种算术操作符的元方法名字:_add,_sub,_mul,_div,_unm,_mod,_pow. --使用步骤: -- 创建一个元表     local mt = {};     mt.__add = functio

第十三章 元表与元方法 Lua程序设计笔记

--第十三章 元表与元方法Lua中每个值都有一个表.table和userdata可以有各自独立的元表,其他类型的值共享一个元表.Lua中只能设置table的元表.若要设置其他类型的值的元表,则必须通过C代码来完成. --13.1算数类型的元方法 Set = {} local mt = {} --创建元表 function Set.new(l)--根据参数列表中的值创建一个新的集合 local set = {} setmetatable(set, mt) --设置元表 for _,v in ipa